Merge changes Ie2704965,Id77b15b7,I0b68e779 into main

* changes:
  Rename interned_str_params to str_param_iids
  Process stackstrace in ProtoLog trace processor
  Update ProtoLog protos to support stacktrace collection
diff --git a/Android.bp b/Android.bp
index 55e3c23..4165586 100644
--- a/Android.bp
+++ b/Android.bp
@@ -2324,6 +2324,7 @@
         ":perfetto_src_trace_processor_containers_containers",
         ":perfetto_src_trace_processor_db_column_column",
         ":perfetto_src_trace_processor_db_db",
+        ":perfetto_src_trace_processor_db_minimal",
         ":perfetto_src_trace_processor_export_json",
         ":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
         ":perfetto_src_trace_processor_importers_common_common",
@@ -10978,10 +10979,17 @@
 filegroup {
     name: "perfetto_src_trace_processor_db_db",
     srcs: [
+        "src/trace_processor/db/runtime_table.cc",
+    ],
+}
+
+// GN: //src/trace_processor/db:minimal
+filegroup {
+    name: "perfetto_src_trace_processor_db_minimal",
+    srcs: [
         "src/trace_processor/db/column.cc",
         "src/trace_processor/db/column_storage.cc",
         "src/trace_processor/db/query_executor.cc",
-        "src/trace_processor/db/runtime_table.cc",
         "src/trace_processor/db/table.cc",
     ],
 }
@@ -11071,7 +11079,6 @@
         "src/trace_processor/importers/common/process_tracker.cc",
         "src/trace_processor/importers/common/slice_tracker.cc",
         "src/trace_processor/importers/common/slice_translation_table.cc",
-        "src/trace_processor/importers/common/stack_profile_tracker.cc",
         "src/trace_processor/importers/common/system_info_tracker.cc",
         "src/trace_processor/importers/common/trace_parser.cc",
         "src/trace_processor/importers/common/track_tracker.cc",
@@ -11391,6 +11398,7 @@
         "src/trace_processor/importers/proto/chrome_system_probes_module.cc",
         "src/trace_processor/importers/proto/chrome_system_probes_parser.cc",
         "src/trace_processor/importers/proto/default_modules.cc",
+        "src/trace_processor/importers/proto/heap_profile_tracker.cc",
         "src/trace_processor/importers/proto/memory_tracker_snapshot_module.cc",
         "src/trace_processor/importers/proto/memory_tracker_snapshot_parser.cc",
         "src/trace_processor/importers/proto/metadata_minimal_module.cc",
@@ -11399,12 +11407,12 @@
         "src/trace_processor/importers/proto/packet_sequence_state_generation.cc",
         "src/trace_processor/importers/proto/perf_sample_tracker.cc",
         "src/trace_processor/importers/proto/profile_module.cc",
-        "src/trace_processor/importers/proto/profile_packet_sequence_state.cc",
         "src/trace_processor/importers/proto/profile_packet_utils.cc",
+        "src/trace_processor/importers/proto/profiler_util.cc",
         "src/trace_processor/importers/proto/proto_trace_parser.cc",
         "src/trace_processor/importers/proto/proto_trace_reader.cc",
         "src/trace_processor/importers/proto/proto_trace_tokenizer.cc",
-        "src/trace_processor/importers/proto/stack_profile_sequence_state.cc",
+        "src/trace_processor/importers/proto/stack_profile_tracker.cc",
         "src/trace_processor/importers/proto/track_event_module.cc",
         "src/trace_processor/importers/proto/track_event_parser.cc",
         "src/trace_processor/importers/proto/track_event_tokenizer.cc",
@@ -11431,9 +11439,9 @@
     srcs: [
         "src/trace_processor/importers/proto/active_chrome_processes_tracker_unittest.cc",
         "src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc",
+        "src/trace_processor/importers/proto/heap_profile_tracker_unittest.cc",
         "src/trace_processor/importers/proto/network_trace_module_unittest.cc",
         "src/trace_processor/importers/proto/perf_sample_tracker_unittest.cc",
-        "src/trace_processor/importers/proto/profile_packet_sequence_state_unittest.cc",
         "src/trace_processor/importers/proto/proto_trace_parser_unittest.cc",
         "src/trace_processor/importers/proto/string_encoding_utils_unittests.cc",
     ],
@@ -11968,6 +11976,7 @@
         "src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/network_packets.sql",
+        "src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/process_metadata.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/screenshots.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/services.sql",
@@ -11990,17 +11999,28 @@
         "src/trace_processor/perfetto_sql/stdlib/common/thread_states.sql",
         "src/trace_processor/perfetto_sql/stdlib/common/timestamps.sql",
         "src/trace_processor/perfetto_sql/stdlib/counters/intervals.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/args.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/counters.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/cpus.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/metadata.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/percentiles.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/thread_states.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/timestamps.sql",
         "src/trace_processor/perfetto_sql/stdlib/graphs/dominator_tree.sql",
         "src/trace_processor/perfetto_sql/stdlib/graphs/search.sql",
         "src/trace_processor/perfetto_sql/stdlib/intervals/overlap.sql",
         "src/trace_processor/perfetto_sql/stdlib/linux/cpu_idle.sql",
         "src/trace_processor/perfetto_sql/stdlib/pkvm/hypervisor.sql",
         "src/trace_processor/perfetto_sql/stdlib/prelude/slices.sql",
+        "src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql",
         "src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql",
         "src/trace_processor/perfetto_sql/stdlib/sched/thread_level_parallelism.sql",
         "src/trace_processor/perfetto_sql/stdlib/sched/thread_state_flattened.sql",
         "src/trace_processor/perfetto_sql/stdlib/slices/flat_slices.sql",
         "src/trace_processor/perfetto_sql/stdlib/slices/slices.sql",
+        "src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql",
+        "src/trace_processor/perfetto_sql/stdlib/time/conversion.sql",
     ],
     cmd: "$(location tools/gen_amalgamated_sql.py) --namespace=stdlib --cpp-out=$(out) $(in)",
     out: [
@@ -12351,7 +12371,6 @@
 filegroup {
     name: "perfetto_src_trace_processor_util_stack_traces_util",
     srcs: [
-        "src/trace_processor/util/profiler_util.cc",
         "src/trace_processor/util/stack_traces_util.cc",
     ],
 }
@@ -13779,6 +13798,7 @@
         ":perfetto_src_trace_processor_db_column_unittests",
         ":perfetto_src_trace_processor_db_compare",
         ":perfetto_src_trace_processor_db_db",
+        ":perfetto_src_trace_processor_db_minimal",
         ":perfetto_src_trace_processor_db_unittests",
         ":perfetto_src_trace_processor_export_json",
         ":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
@@ -14495,6 +14515,7 @@
         ":perfetto_src_trace_processor_containers_containers",
         ":perfetto_src_trace_processor_db_column_column",
         ":perfetto_src_trace_processor_db_db",
+        ":perfetto_src_trace_processor_db_minimal",
         ":perfetto_src_trace_processor_export_json",
         ":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
         ":perfetto_src_trace_processor_importers_common_common",
@@ -14729,6 +14750,7 @@
         ":perfetto_src_trace_processor_containers_containers",
         ":perfetto_src_trace_processor_db_column_column",
         ":perfetto_src_trace_processor_db_db",
+        ":perfetto_src_trace_processor_db_minimal",
         ":perfetto_src_trace_processor_export_json",
         ":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
         ":perfetto_src_trace_processor_importers_common_common",
diff --git a/BUILD b/BUILD
index f7f2aa6..e6649d9 100644
--- a/BUILD
+++ b/BUILD
@@ -218,6 +218,7 @@
         ":src_protozero_proto_ring_buffer",
         ":src_trace_processor_db_column_column",
         ":src_trace_processor_db_db",
+        ":src_trace_processor_db_minimal",
         ":src_trace_processor_export_json",
         ":src_trace_processor_importers_android_bugreport_android_bugreport",
         ":src_trace_processor_importers_common_common",
@@ -774,6 +775,45 @@
     ],
 )
 
+# GN target: //include/perfetto/public/abi:public
+perfetto_filegroup(
+    name = "include_perfetto_public_abi_public",
+    srcs = [
+        "include/perfetto/public/abi/backend_type.h",
+        "include/perfetto/public/abi/data_source_abi.h",
+        "include/perfetto/public/abi/heap_buffer.h",
+        "include/perfetto/public/abi/pb_decoder_abi.h",
+        "include/perfetto/public/abi/producer_abi.h",
+        "include/perfetto/public/abi/stream_writer_abi.h",
+        "include/perfetto/public/abi/thread_utils_abi.h",
+        "include/perfetto/public/abi/tracing_session_abi.h",
+        "include/perfetto/public/abi/track_event_abi.h",
+        "include/perfetto/public/abi/track_event_hl_abi.h",
+        "include/perfetto/public/abi/track_event_ll_abi.h",
+    ],
+)
+
+# GN target: //include/perfetto/public/protos:protos
+perfetto_filegroup(
+    name = "include_perfetto_public_protos_protos",
+    srcs = [
+        "include/perfetto/public/protos/common/builtin_clock.pzc.h",
+        "include/perfetto/public/protos/common/data_source_descriptor.pzc.h",
+        "include/perfetto/public/protos/config/data_source_config.pzc.h",
+        "include/perfetto/public/protos/config/trace_config.pzc.h",
+        "include/perfetto/public/protos/config/track_event/track_event_config.pzc.h",
+        "include/perfetto/public/protos/trace/interned_data/interned_data.pzc.h",
+        "include/perfetto/public/protos/trace/test_event.pzc.h",
+        "include/perfetto/public/protos/trace/trace.pzc.h",
+        "include/perfetto/public/protos/trace/trace_packet.pzc.h",
+        "include/perfetto/public/protos/trace/track_event/counter_descriptor.pzc.h",
+        "include/perfetto/public/protos/trace/track_event/debug_annotation.pzc.h",
+        "include/perfetto/public/protos/trace/track_event/track_descriptor.pzc.h",
+        "include/perfetto/public/protos/trace/track_event/track_event.pzc.h",
+        "include/perfetto/public/protos/trace/trigger.pzc.h",
+    ],
+)
+
 # GN target: //include/perfetto/public:base
 perfetto_filegroup(
     name = "include_perfetto_public_base",
@@ -790,6 +830,25 @@
     ],
 )
 
+# GN target: //include/perfetto/public:public
+perfetto_filegroup(
+    name = "include_perfetto_public_public",
+    srcs = [
+        "include/perfetto/public/data_source.h",
+        "include/perfetto/public/fnv1a.h",
+        "include/perfetto/public/pb_decoder.h",
+        "include/perfetto/public/pb_macros.h",
+        "include/perfetto/public/pb_msg.h",
+        "include/perfetto/public/pb_packed.h",
+        "include/perfetto/public/producer.h",
+        "include/perfetto/public/stream_writer.h",
+        "include/perfetto/public/te_category_macros.h",
+        "include/perfetto/public/te_macros.h",
+        "include/perfetto/public/thread_utils.h",
+        "include/perfetto/public/track_event.h",
+    ],
+)
+
 # GN target: //include/perfetto/trace_processor:basic_types
 perfetto_filegroup(
     name = "include_perfetto_trace_processor_basic_types",
@@ -1254,6 +1313,32 @@
     ],
 )
 
+# GN target: //src/shared_lib:intern_map
+perfetto_filegroup(
+    name = "src_shared_lib_intern_map",
+    srcs = [
+        "src/shared_lib/intern_map.cc",
+        "src/shared_lib/intern_map.h",
+    ],
+)
+
+# GN target: //src/shared_lib:shared_lib
+perfetto_filegroup(
+    name = "src_shared_lib_shared_lib",
+    srcs = [
+        "src/shared_lib/data_source.cc",
+        "src/shared_lib/heap_buffer.cc",
+        "src/shared_lib/pb_decoder.cc",
+        "src/shared_lib/producer.cc",
+        "src/shared_lib/reset_for_testing.h",
+        "src/shared_lib/stream_writer.cc",
+        "src/shared_lib/stream_writer.h",
+        "src/shared_lib/thread_utils.cc",
+        "src/shared_lib/tracing_session.cc",
+        "src/shared_lib/track_event.cc",
+    ],
+)
+
 # GN target: //src/trace_processor/containers:containers
 perfetto_cc_library(
     name = "src_trace_processor_containers_containers",
@@ -1320,6 +1405,15 @@
 perfetto_filegroup(
     name = "src_trace_processor_db_db",
     srcs = [
+        "src/trace_processor/db/runtime_table.cc",
+        "src/trace_processor/db/runtime_table.h",
+    ],
+)
+
+# GN target: //src/trace_processor/db:minimal
+perfetto_filegroup(
+    name = "src_trace_processor_db_minimal",
+    srcs = [
         "src/trace_processor/db/base_id.h",
         "src/trace_processor/db/column.cc",
         "src/trace_processor/db/column.h",
@@ -1329,8 +1423,6 @@
         "src/trace_processor/db/compare.h",
         "src/trace_processor/db/query_executor.cc",
         "src/trace_processor/db/query_executor.h",
-        "src/trace_processor/db/runtime_table.cc",
-        "src/trace_processor/db/runtime_table.h",
         "src/trace_processor/db/table.cc",
         "src/trace_processor/db/table.h",
         "src/trace_processor/db/typed_column.h",
@@ -1381,8 +1473,6 @@
         "src/trace_processor/importers/common/slice_tracker.h",
         "src/trace_processor/importers/common/slice_translation_table.cc",
         "src/trace_processor/importers/common/slice_translation_table.h",
-        "src/trace_processor/importers/common/stack_profile_tracker.cc",
-        "src/trace_processor/importers/common/stack_profile_tracker.h",
         "src/trace_processor/importers/common/system_info_tracker.cc",
         "src/trace_processor/importers/common/system_info_tracker.h",
         "src/trace_processor/importers/common/trace_parser.cc",
@@ -1731,6 +1821,8 @@
         "src/trace_processor/importers/proto/chrome_system_probes_parser.h",
         "src/trace_processor/importers/proto/default_modules.cc",
         "src/trace_processor/importers/proto/default_modules.h",
+        "src/trace_processor/importers/proto/heap_profile_tracker.cc",
+        "src/trace_processor/importers/proto/heap_profile_tracker.h",
         "src/trace_processor/importers/proto/memory_tracker_snapshot_module.cc",
         "src/trace_processor/importers/proto/memory_tracker_snapshot_module.h",
         "src/trace_processor/importers/proto/memory_tracker_snapshot_parser.cc",
@@ -1747,10 +1839,10 @@
         "src/trace_processor/importers/proto/perf_sample_tracker.h",
         "src/trace_processor/importers/proto/profile_module.cc",
         "src/trace_processor/importers/proto/profile_module.h",
-        "src/trace_processor/importers/proto/profile_packet_sequence_state.cc",
-        "src/trace_processor/importers/proto/profile_packet_sequence_state.h",
         "src/trace_processor/importers/proto/profile_packet_utils.cc",
         "src/trace_processor/importers/proto/profile_packet_utils.h",
+        "src/trace_processor/importers/proto/profiler_util.cc",
+        "src/trace_processor/importers/proto/profiler_util.h",
         "src/trace_processor/importers/proto/proto_incremental_state.h",
         "src/trace_processor/importers/proto/proto_trace_parser.cc",
         "src/trace_processor/importers/proto/proto_trace_parser.h",
@@ -1758,8 +1850,8 @@
         "src/trace_processor/importers/proto/proto_trace_reader.h",
         "src/trace_processor/importers/proto/proto_trace_tokenizer.cc",
         "src/trace_processor/importers/proto/proto_trace_tokenizer.h",
-        "src/trace_processor/importers/proto/stack_profile_sequence_state.cc",
-        "src/trace_processor/importers/proto/stack_profile_sequence_state.h",
+        "src/trace_processor/importers/proto/stack_profile_tracker.cc",
+        "src/trace_processor/importers/proto/stack_profile_tracker.h",
         "src/trace_processor/importers/proto/track_event_module.cc",
         "src/trace_processor/importers/proto/track_event_module.h",
         "src/trace_processor/importers/proto/track_event_parser.cc",
@@ -2272,6 +2364,7 @@
         "src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/network_packets.sql",
+        "src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/process_metadata.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/screenshots.sql",
         "src/trace_processor/perfetto_sql/stdlib/android/services.sql",
@@ -2311,6 +2404,21 @@
     ],
 )
 
+# GN target: //src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common:common
+perfetto_filegroup(
+    name = "src_trace_processor_perfetto_sql_stdlib_deprecated_v42_common_common",
+    srcs = [
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/args.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/counters.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/cpus.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/metadata.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/percentiles.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/thread_states.sql",
+        "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/timestamps.sql",
+    ],
+)
+
 # GN target: //src/trace_processor/perfetto_sql/stdlib/graphs:graphs
 perfetto_filegroup(
     name = "src_trace_processor_perfetto_sql_stdlib_graphs_graphs",
@@ -2349,6 +2457,7 @@
     name = "src_trace_processor_perfetto_sql_stdlib_prelude_prelude",
     srcs = [
         "src/trace_processor/perfetto_sql/stdlib/prelude/slices.sql",
+        "src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql",
     ],
 )
 
@@ -2368,6 +2477,15 @@
     srcs = [
         "src/trace_processor/perfetto_sql/stdlib/slices/flat_slices.sql",
         "src/trace_processor/perfetto_sql/stdlib/slices/slices.sql",
+        "src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql",
+    ],
+)
+
+# GN target: //src/trace_processor/perfetto_sql/stdlib/time:time
+perfetto_filegroup(
+    name = "src_trace_processor_perfetto_sql_stdlib_time_time",
+    srcs = [
+        "src/trace_processor/perfetto_sql/stdlib/time/conversion.sql",
     ],
 )
 
@@ -2380,6 +2498,7 @@
         ":src_trace_processor_perfetto_sql_stdlib_chrome_chrome_sql",
         ":src_trace_processor_perfetto_sql_stdlib_common_common",
         ":src_trace_processor_perfetto_sql_stdlib_counters_counters",
+        ":src_trace_processor_perfetto_sql_stdlib_deprecated_v42_common_common",
         ":src_trace_processor_perfetto_sql_stdlib_graphs_graphs",
         ":src_trace_processor_perfetto_sql_stdlib_intervals_intervals",
         ":src_trace_processor_perfetto_sql_stdlib_linux_linux",
@@ -2387,6 +2506,7 @@
         ":src_trace_processor_perfetto_sql_stdlib_prelude_prelude",
         ":src_trace_processor_perfetto_sql_stdlib_sched_sched",
         ":src_trace_processor_perfetto_sql_stdlib_slices_slices",
+        ":src_trace_processor_perfetto_sql_stdlib_time_time",
     ],
     outs = [
         "src/trace_processor/perfetto_sql/stdlib/stdlib.h",
@@ -2652,8 +2772,6 @@
 perfetto_filegroup(
     name = "src_trace_processor_util_stack_traces_util",
     srcs = [
-        "src/trace_processor/util/profiler_util.cc",
-        "src/trace_processor/util/profiler_util.h",
         "src/trace_processor/util/stack_traces_util.cc",
         "src/trace_processor/util/stack_traces_util.h",
     ],
@@ -5306,6 +5424,112 @@
     ],
 )
 
+# GN target: //src/shared_lib:libperfetto_c
+perfetto_cc_library(
+    name = "libperfetto_c",
+    srcs = [
+        ":src_android_stats_android_stats",
+        ":src_android_stats_perfetto_atoms",
+        ":src_protozero_filtering_bytecode_common",
+        ":src_protozero_filtering_bytecode_parser",
+        ":src_protozero_filtering_message_filter",
+        ":src_protozero_filtering_string_filter",
+        ":src_shared_lib_intern_map",
+        ":src_shared_lib_shared_lib",
+        ":src_tracing_client_api_without_backends",
+        ":src_tracing_common",
+        ":src_tracing_core_core",
+        ":src_tracing_in_process_backend",
+        ":src_tracing_ipc_common",
+        ":src_tracing_ipc_consumer_consumer",
+        ":src_tracing_ipc_default_socket",
+        ":src_tracing_ipc_producer_producer",
+        ":src_tracing_ipc_service_service",
+        ":src_tracing_platform_impl",
+        ":src_tracing_service_service",
+        ":src_tracing_system_backend",
+    ],
+    hdrs = [
+        ":include_perfetto_base_base",
+        ":include_perfetto_ext_base_base",
+        ":include_perfetto_ext_ipc_ipc",
+        ":include_perfetto_ext_tracing_core_core",
+        ":include_perfetto_ext_tracing_ipc_ipc",
+        ":include_perfetto_protozero_protozero",
+        ":include_perfetto_public_abi_base",
+        ":include_perfetto_public_abi_public",
+        ":include_perfetto_public_base",
+        ":include_perfetto_public_protos_protos",
+        ":include_perfetto_public_protozero",
+        ":include_perfetto_public_public",
+        ":include_perfetto_tracing_core_core",
+        ":include_perfetto_tracing_core_forward_decls",
+        ":include_perfetto_tracing_tracing",
+    ],
+    defines = [
+        "PERFETTO_SHLIB_SDK_IMPLEMENTATION",
+    ],
+    visibility = [
+        "//visibility:public",
+    ],
+    deps = [
+        ":perfetto_ipc",
+        ":protos_perfetto_common_cpp",
+        ":protos_perfetto_common_zero",
+        ":protos_perfetto_config_android_cpp",
+        ":protos_perfetto_config_android_zero",
+        ":protos_perfetto_config_cpp",
+        ":protos_perfetto_config_ftrace_cpp",
+        ":protos_perfetto_config_ftrace_zero",
+        ":protos_perfetto_config_gpu_cpp",
+        ":protos_perfetto_config_gpu_zero",
+        ":protos_perfetto_config_inode_file_cpp",
+        ":protos_perfetto_config_inode_file_zero",
+        ":protos_perfetto_config_interceptors_cpp",
+        ":protos_perfetto_config_interceptors_zero",
+        ":protos_perfetto_config_power_cpp",
+        ":protos_perfetto_config_power_zero",
+        ":protos_perfetto_config_process_stats_cpp",
+        ":protos_perfetto_config_process_stats_zero",
+        ":protos_perfetto_config_profiling_cpp",
+        ":protos_perfetto_config_profiling_zero",
+        ":protos_perfetto_config_statsd_cpp",
+        ":protos_perfetto_config_statsd_zero",
+        ":protos_perfetto_config_sys_stats_cpp",
+        ":protos_perfetto_config_sys_stats_zero",
+        ":protos_perfetto_config_system_info_cpp",
+        ":protos_perfetto_config_system_info_zero",
+        ":protos_perfetto_config_track_event_cpp",
+        ":protos_perfetto_config_track_event_zero",
+        ":protos_perfetto_config_zero",
+        ":protos_perfetto_ipc_cpp",
+        ":protos_perfetto_ipc_ipc",
+        ":protos_perfetto_trace_android_zero",
+        ":protos_perfetto_trace_chrome_zero",
+        ":protos_perfetto_trace_etw_zero",
+        ":protos_perfetto_trace_filesystem_zero",
+        ":protos_perfetto_trace_ftrace_zero",
+        ":protos_perfetto_trace_gpu_zero",
+        ":protos_perfetto_trace_interned_data_zero",
+        ":protos_perfetto_trace_minimal_zero",
+        ":protos_perfetto_trace_non_minimal_zero",
+        ":protos_perfetto_trace_perfetto_zero",
+        ":protos_perfetto_trace_power_zero",
+        ":protos_perfetto_trace_profiling_zero",
+        ":protos_perfetto_trace_ps_zero",
+        ":protos_perfetto_trace_statsd_zero",
+        ":protos_perfetto_trace_sys_stats_zero",
+        ":protos_perfetto_trace_system_info_zero",
+        ":protos_perfetto_trace_track_event_cpp",
+        ":protos_perfetto_trace_track_event_zero",
+        ":protos_perfetto_trace_translation_zero",
+        ":protozero",
+        ":src_base_base",
+        ":src_base_version",
+    ],
+    linkstatic = True,
+)
+
 # GN target: //src/trace_processor:trace_processor
 perfetto_cc_library(
     name = "trace_processor",
@@ -5313,6 +5537,7 @@
         ":src_kernel_utils_syscall_table",
         ":src_trace_processor_db_column_column",
         ":src_trace_processor_db_db",
+        ":src_trace_processor_db_minimal",
         ":src_trace_processor_export_json",
         ":src_trace_processor_importers_android_bugreport_android_bugreport",
         ":src_trace_processor_importers_common_common",
@@ -5478,6 +5703,7 @@
         ":src_protozero_proto_ring_buffer",
         ":src_trace_processor_db_column_column",
         ":src_trace_processor_db_db",
+        ":src_trace_processor_db_minimal",
         ":src_trace_processor_export_json",
         ":src_trace_processor_importers_android_bugreport_android_bugreport",
         ":src_trace_processor_importers_common_common",
@@ -5617,17 +5843,7 @@
         ":src_profiling_deobfuscator",
         ":src_profiling_symbolizer_symbolize_database",
         ":src_profiling_symbolizer_symbolizer",
-        ":src_trace_processor_db_column_column",
-        ":src_trace_processor_db_db",
-        ":src_trace_processor_metatrace",
-        ":src_trace_processor_storage_storage",
-        ":src_trace_processor_tables_tables",
-        ":src_trace_processor_tables_tables_python",
-        ":src_trace_processor_types_types",
-        ":src_trace_processor_util_glob",
-        ":src_trace_processor_util_regex",
         ":src_trace_processor_util_stack_traces_util",
-        ":src_trace_processor_util_util",
         ":src_traceconv_pprofbuilder",
         ":src_traceconv_utils",
     ],
@@ -5672,7 +5888,6 @@
         ":protos_perfetto_trace_non_minimal_zero",
         ":protos_perfetto_trace_perfetto_zero",
         ":protos_perfetto_trace_power_zero",
-        ":protos_perfetto_trace_processor_zero",
         ":protos_perfetto_trace_profiling_zero",
         ":protos_perfetto_trace_ps_zero",
         ":protos_perfetto_trace_statsd_zero",
@@ -5682,7 +5897,6 @@
         ":protos_perfetto_trace_translation_zero",
         ":protos_third_party_pprof_zero",
         ":protozero",
-        ":src_base_base",
         ":src_trace_processor_containers_containers",
     ] + PERFETTO_CONFIG.deps.zlib,
     linkstatic = True,
@@ -5713,6 +5927,7 @@
         ":src_protozero_proto_ring_buffer",
         ":src_trace_processor_db_column_column",
         ":src_trace_processor_db_db",
+        ":src_trace_processor_db_minimal",
         ":src_trace_processor_export_json",
         ":src_trace_processor_importers_android_bugreport_android_bugreport",
         ":src_trace_processor_importers_common_common",
diff --git a/buildtools/BUILD.gn b/buildtools/BUILD.gn
index 6a44fbe..1d6e039 100644
--- a/buildtools/BUILD.gn
+++ b/buildtools/BUILD.gn
@@ -1421,7 +1421,10 @@
   ]
   cflags = [ "-DFAKE_LOG_DEVICE=1" ]
   if (!is_win) {
-    cflags += [ "-Wno-deprecated-declarations" ]
+    cflags += [
+      "-Wno-deprecated-declarations",
+      "-Wno-vla-cxx-extension",
+    ]
   }
   public_configs = [ ":libunwindstack_config" ]
 }
diff --git a/gn/standalone/BUILD.gn b/gn/standalone/BUILD.gn
index 1fb8196..43c81d0 100644
--- a/gn/standalone/BUILD.gn
+++ b/gn/standalone/BUILD.gn
@@ -65,7 +65,10 @@
   # Disable variadic macro warning as we make extensive use of them in trace
   # processor and client API.
   if (is_clang) {
-    if (!is_fuzzer) {
+    # Only enable -Weverything on hermetic clang as system clang might be quite
+    # out of date.
+    if (is_hermetic_clang && current_toolchain == host_toolchain &&
+        !is_fuzzer) {
       # Disable Weverything on fuzzers to avoid breakages when new versions of
       # clang are rolled into OSS-fuzz.
       cflags += [ "-Weverything" ]
@@ -86,6 +89,10 @@
       "-Wno-unknown-sanitizers",
       "-Wno-unknown-warning-option",
       "-Wno-unsafe-buffer-usage",
+
+      # TODO(primiano): -Wswitch-default could be useful but will require a mass
+      # codebase cleanup.
+      "-Wno-switch-default",
     ]
   } else if (!is_clang && !is_win) {
     # Use return std::move(...) for compatibility with old GCC compilers.
diff --git a/infra/perfetto.dev/src/gen_stdlib_docs_md.py b/infra/perfetto.dev/src/gen_stdlib_docs_md.py
index 47007a7..6fc5283 100644
--- a/infra/perfetto.dev/src/gen_stdlib_docs_md.py
+++ b/infra/perfetto.dev/src/gen_stdlib_docs_md.py
@@ -224,9 +224,10 @@
   modules_dict: Dict[str, ModuleMd] = {}
 
   for module_name, module_files in modules_json_dict.items():
-    modules_dict[module_name] = ModuleMd(module_name, module_files)
+    # Remove 'common' when it has been removed from the code.
+    if module_name not in ['deprecated', 'common']:
+      modules_dict[module_name] = ModuleMd(module_name, module_files)
 
-  common_module = modules_dict.pop('common')
   prelude_module = modules_dict.pop('prelude')
 
   with open(args.output, 'w') as f:
@@ -274,8 +275,6 @@
 
     summary_objs = [prelude_module.summary_objs
                    ] if prelude_module.summary_objs else []
-    summary_objs += [common_module.summary_objs
-                    ] if common_module.summary_objs else []
     summary_objs += [
         module.summary_objs
         for name, module in modules_dict.items()
@@ -284,8 +283,6 @@
 
     summary_funs = [prelude_module.summary_funs
                    ] if prelude_module.summary_funs else []
-    summary_funs += [common_module.summary_funs
-                    ] if common_module.summary_funs else []
     summary_funs += [
         module.summary_funs
         for name, module in modules_dict.items()
@@ -293,8 +290,6 @@
     ]
     summary_view_funs = [prelude_module.summary_view_funs
                         ] if prelude_module.summary_view_funs else []
-    summary_view_funs += [common_module.summary_view_funs
-                         ] if common_module.summary_view_funs else []
     summary_view_funs += [
         module.summary_view_funs
         for name, module in modules_dict.items()
@@ -302,8 +297,6 @@
     ]
     summary_macros = [prelude_module.summary_macros
                      ] if prelude_module.summary_macros else []
-    summary_macros += [common_module.summary_macros
-                      ] if common_module.summary_macros else []
     summary_macros += [
         module.summary_macros
         for name, module in modules_dict.items()
@@ -341,8 +334,6 @@
     f.write('\n\n')
     f.write(prelude_module.print_description())
     f.write('\n')
-    f.write(common_module.print_description())
-    f.write('\n')
     f.write('\n'.join(
         module.print_description() for module in modules_dict.values()))
 
diff --git a/protos/perfetto/metrics/android/binder_metric.proto b/protos/perfetto/metrics/android/binder_metric.proto
index c7f3516..d16e2ee 100644
--- a/protos/perfetto/metrics/android/binder_metric.proto
+++ b/protos/perfetto/metrics/android/binder_metric.proto
@@ -32,7 +32,7 @@
     optional uint32 count = 4;
   }
 
-  // Next field id: 28
+  // Next field id: 30
   message UnaggregatedTxnBreakdown {
     // General
     optional string aidl_name = 1;
@@ -47,6 +47,7 @@
     optional bool is_main_thread = 5;
     optional int64 client_ts = 6;
     optional int64 client_dur = 7;
+    optional int64 client_monotonic_dur = 28;
     optional int64 client_oom_score = 19;
     optional int64 client_package_version_code = 24;
     optional bool is_client_package_debuggable = 25;
@@ -57,6 +58,7 @@
     optional string server_thread = 10;
     optional int64 server_ts = 11;
     optional int64 server_dur = 12;
+    optional int64 server_monotonic_dur = 29;
     optional int64 server_oom_score = 20;
     optional int64 server_package_version_code = 26;
     optional bool is_server_package_debuggable = 27;
diff --git a/protos/perfetto/metrics/android/monitor_contention_metric.proto b/protos/perfetto/metrics/android/monitor_contention_metric.proto
index 1973ffb..a13e2ba 100644
--- a/protos/perfetto/metrics/android/monitor_contention_metric.proto
+++ b/protos/perfetto/metrics/android/monitor_contention_metric.proto
@@ -21,7 +21,7 @@
 // This metric provides information about the monitor contention graph in a
 // trace
 message AndroidMonitorContentionMetric {
-  // Next field id: 25
+  // Next field id: 26
   message Node {
     // Global context
     optional int64 node_parent_id = 1;
@@ -29,6 +29,7 @@
     optional int64 node_id = 2;
     optional int64 ts = 3;
     optional int64 dur = 4;
+    optional int64 monotonic_dur = 25;
     optional string process_name = 14;
     optional uint32 pid = 23;
     optional uint32 waiter_count = 11;
diff --git a/protos/perfetto/metrics/perfetto_merged_metrics.proto b/protos/perfetto/metrics/perfetto_merged_metrics.proto
index 75e89f0..32640f6 100644
--- a/protos/perfetto/metrics/perfetto_merged_metrics.proto
+++ b/protos/perfetto/metrics/perfetto_merged_metrics.proto
@@ -340,7 +340,7 @@
     optional uint32 count = 4;
   }
 
-  // Next field id: 28
+  // Next field id: 30
   message UnaggregatedTxnBreakdown {
     // General
     optional string aidl_name = 1;
@@ -355,6 +355,7 @@
     optional bool is_main_thread = 5;
     optional int64 client_ts = 6;
     optional int64 client_dur = 7;
+    optional int64 client_monotonic_dur = 28;
     optional int64 client_oom_score = 19;
     optional int64 client_package_version_code = 24;
     optional bool is_client_package_debuggable = 25;
@@ -365,6 +366,7 @@
     optional string server_thread = 10;
     optional int64 server_ts = 11;
     optional int64 server_dur = 12;
+    optional int64 server_monotonic_dur = 29;
     optional int64 server_oom_score = 20;
     optional int64 server_package_version_code = 26;
     optional bool is_server_package_debuggable = 27;
@@ -1475,7 +1477,7 @@
 // This metric provides information about the monitor contention graph in a
 // trace
 message AndroidMonitorContentionMetric {
-  // Next field id: 25
+  // Next field id: 26
   message Node {
     // Global context
     optional int64 node_parent_id = 1;
@@ -1483,6 +1485,7 @@
     optional int64 node_id = 2;
     optional int64 ts = 3;
     optional int64 dur = 4;
+    optional int64 monotonic_dur = 25;
     optional string process_name = 14;
     optional uint32 pid = 23;
     optional uint32 waiter_count = 11;
diff --git a/protos/perfetto/trace/BUILD.gn b/protos/perfetto/trace/BUILD.gn
index c808a93..b131e7d 100644
--- a/protos/perfetto/trace/BUILD.gn
+++ b/protos/perfetto/trace/BUILD.gn
@@ -20,7 +20,7 @@
 # 2. Minimal set: :minimal_zero, :minimal_lite. These are mainly for chrome, to
 #    avoid bloating binary size by pulling unnecessary protos.
 #
-# In practice, however, we need to split them in disjoint targets (minmal and
+# In practice, however, we need to split them in disjoint targets (minimal and
 # non-minimal) and then use a group() target for the full protos. This is
 # because build systems don't like two targets having genrules for the same
 # .proto files.
diff --git a/protos/perfetto/trace/ftrace/ftrace_event_bundle.proto b/protos/perfetto/trace/ftrace/ftrace_event_bundle.proto
index 99a6e26..5bfab9dd 100644
--- a/protos/perfetto/trace/ftrace/ftrace_event_bundle.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_event_bundle.proto
@@ -31,10 +31,6 @@
   // Set to true if there was data loss between the last time we've read from
   // the corresponding per-cpu kernel buffer, and the earliest event recorded
   // in this bundle.
-  // TODO(rsavitski): consider replicating in the newer FtraceError. This field
-  // has been set since the original implementation, but used only for manual
-  // debugging. Trace processor instead looks at the FtraceStats totals for the
-  // tracing session.
   optional bool lost_events = 3;
 
   // Optionally-enabled compact encoding of a batch of scheduling events. Only
diff --git a/protos/perfetto/trace/ftrace/ftrace_stats.proto b/protos/perfetto/trace/ftrace/ftrace_stats.proto
index c5f06b9..f921779 100644
--- a/protos/perfetto/trace/ftrace/ftrace_stats.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_stats.proto
@@ -40,6 +40,8 @@
 
   // Size of entries currently in the kernel buffer (see |entries|) in bytes.
   // The field should be named "bytes", but is misnamed for historical reasons.
+  // This value has known inaccuracies before Linux v6.6:
+  // https://github.com/torvalds/linux/commit/45d99ea
   optional uint64 bytes_read = 5;
 
   // The timestamp for the oldest event still in the ring buffer.
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index a69110b..f9370cd 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -10450,6 +10450,8 @@
 
   // Size of entries currently in the kernel buffer (see |entries|) in bytes.
   // The field should be named "bytes", but is misnamed for historical reasons.
+  // This value has known inaccuracies before Linux v6.6:
+  // https://github.com/torvalds/linux/commit/45d99ea
   optional uint64 bytes_read = 5;
 
   // The timestamp for the oldest event still in the ring buffer.
@@ -10561,10 +10563,6 @@
   // Set to true if there was data loss between the last time we've read from
   // the corresponding per-cpu kernel buffer, and the earliest event recorded
   // in this bundle.
-  // TODO(rsavitski): consider replicating in the newer FtraceError. This field
-  // has been set since the original implementation, but used only for manual
-  // debugging. Trace processor instead looks at the FtraceStats totals for the
-  // tracing session.
   optional bool lost_events = 3;
 
   // Optionally-enabled compact encoding of a batch of scheduling events. Only
diff --git a/python/generators/sql_processing/docs_parse.py b/python/generators/sql_processing/docs_parse.py
index 31cea3c..6e8cd60 100644
--- a/python/generators/sql_processing/docs_parse.py
+++ b/python/generators/sql_processing/docs_parse.py
@@ -20,9 +20,15 @@
 from typing import Any, Dict, List, Optional, Set, Tuple, NamedTuple
 
 from python.generators.sql_processing.docs_extractor import DocsExtractor
-from python.generators.sql_processing.utils import ALLOWED_PREFIXES, ANY_PATTERN, ARG_DEFINITION_PATTERN, ObjKind
-from python.generators.sql_processing.utils import ARG_ANNOTATION_PATTERN
+from python.generators.sql_processing.utils import ObjKind
+
+from python.generators.sql_processing.utils import ALLOWED_PREFIXES
+from python.generators.sql_processing.utils import OBJECT_NAME_ALLOWLIST
+
 from python.generators.sql_processing.utils import COLUMN_ANNOTATION_PATTERN
+from python.generators.sql_processing.utils import ANY_PATTERN
+from python.generators.sql_processing.utils import ARG_DEFINITION_PATTERN
+from python.generators.sql_processing.utils import ARG_ANNOTATION_PATTERN
 
 
 def is_internal(name: str) -> bool:
@@ -50,7 +56,7 @@
 # Returns: error message if the name is not correct, None otherwise.
 def get_module_prefix_error(name: str, path: str, module: str) -> Optional[str]:
   prefix = name.lower().split('_')[0]
-  if module == "common" or module == "prelude":
+  if module in ["common", "prelude", "deprecated"]:
     if prefix == module:
       return (f'Names of tables/views/functions in the "{module}" module '
               f'should not start with {module}')
@@ -64,6 +70,8 @@
       if prefix == allowed_name_prefix:
         return None
       allowed_prefixes.append(allowed_name_prefix)
+    if path in OBJECT_NAME_ALLOWLIST and name in OBJECT_NAME_ALLOWLIST[path]:
+      return None
   return (
       f'Names of tables/views/functions at path "{path}" should be prefixed '
       f'with one of following names: {", ".join(allowed_prefixes)}')
@@ -426,13 +434,17 @@
 
 # Reads the provided SQL and, if possible, generates a dictionary with data
 # from documentation together with errors from validation of the schema.
-def parse_file(path: str, sql: str) -> ParsedFile:
+def parse_file(path: str, sql: str) -> Optional[ParsedFile]:
   if sys.platform.startswith('win'):
     path = path.replace('\\', '/')
 
   # Get module name
   module_name = path.split('/stdlib/')[-1].split('/')[0]
 
+  # Disable support for `deprecated` module
+  if module_name == "deprecated":
+    return
+
   # Extract all the docs from the SQL.
   extractor = DocsExtractor(path, module_name, sql)
   docs = extractor.extract()
diff --git a/python/generators/sql_processing/utils.py b/python/generators/sql_processing/utils.py
index 49564dd..ba14110 100644
--- a/python/generators/sql_processing/utils.py
+++ b/python/generators/sql_processing/utils.py
@@ -111,6 +111,12 @@
     'counters': 'counter',
     'chrome/util': 'cr',
     'graphs': 'graph',
+    'slices': 'slice'
+}
+
+# Allows for nonstandard object names.
+OBJECT_NAME_ALLOWLIST = {
+    'slices/with_context.sql': ['process_slice', 'thread_slice']
 }
 
 # Given a regex pattern and a string to match against, returns all the
diff --git a/python/generators/trace_processor_table/serialize.py b/python/generators/trace_processor_table/serialize.py
index 176ecfe..1f92f44 100644
--- a/python/generators/trace_processor_table/serialize.py
+++ b/python/generators/trace_processor_table/serialize.py
@@ -19,6 +19,7 @@
 from python.generators.trace_processor_table.public import ColumnFlag
 from python.generators.trace_processor_table.util import ParsedTable
 from python.generators.trace_processor_table.util import ParsedColumn
+from python.generators.trace_processor_table.util import data_layer_type
 from python.generators.trace_processor_table.util import parse_type
 from python.generators.trace_processor_table.util import typed_column_type
 
@@ -32,13 +33,18 @@
     self.col = self.parsed_col.column
     self.name = self.col.name
     self.flags = self.col.flags
+
+    parsed_type = parse_type(table.table, self.col.type)
+
     self.typed_column_type = typed_column_type(table.table, self.parsed_col)
-    self.cpp_type = parse_type(table.table,
-                               self.col.type).cpp_type_with_optionality()
+    self.cpp_type = parsed_type.cpp_type_with_optionality()
+    self.data_layer_type = data_layer_type(table.table, self.parsed_col)
 
     self.is_implicit_id = self.parsed_col.is_implicit_id
     self.is_implicit_type = self.parsed_col.is_implicit_type
     self.is_ancestor = self.parsed_col.is_ancestor
+    self.is_string = parsed_type.cpp_type == 'StringPool::Id'
+    self.is_optional = parsed_type.is_optional
 
   def colindex(self) -> str:
     return f'    static constexpr uint32_t {self.name} = {self.col_index};'
@@ -63,14 +69,14 @@
       return None
     if not self.is_ancestor:
       return None
-    return f'std::move(in_{self.name})'
+    return f'in_{self.name}'
 
   def row_initializer(self) -> Optional[str]:
     if self.is_implicit_id or self.is_implicit_type:
       return None
     if self.is_ancestor:
       return None
-    return f'{self.name}(std::move(in_{self.name}))'
+    return f'{self.name}(in_{self.name})'
 
   def const_row_ref_getter(self) -> Optional[str]:
     return f'''ColumnType::{self.name}::type {self.name}() const {{
@@ -115,8 +121,8 @@
     if self.is_ancestor:
       return None
     return f'''
-    columns.emplace_back("{self.name}", &self->{self.name}_, ColumnFlag::{self.name},
-                         static_cast<uint32_t>(columns.size()), olay_idx);
+    AddColumnToVector(columns, "{self.name}", &self->{self.name}_, ColumnFlag::{self.name},
+                      static_cast<uint32_t>(columns.size()), olay_idx);
     '''
 
   def shrink_to_fit(self) -> Optional[str]:
@@ -131,7 +137,7 @@
       return None
     if self.is_ancestor:
       return None
-    return f'    mutable_{self.name}()->Append(std::move(row.{self.name}));'
+    return f'    mutable_{self.name}()->Append(row.{self.name});'
 
   def accessor(self) -> Optional[str]:
     inner = f'columns()[ColumnIndex::{self.name}]'
@@ -232,6 +238,66 @@
     {self.name}_ = std::move({self.name});
     '''
 
+  def storage_layer(self) -> Optional[str]:
+    if self.is_ancestor:
+      return None
+    return f'''
+  RefPtr<column::DataLayer> {self.name}_storage_layer_;
+  '''
+
+  def null_layer(self) -> Optional[str]:
+    if self.is_ancestor:
+      return None
+    if not self.is_optional or self.is_string:
+      return f''
+    return f'''
+  RefPtr<column::DataLayer> {self.name}_null_layer_;
+  '''
+
+  def storage_layer_create(self) -> str:
+    if self.is_ancestor:
+      return f'''const_parent_->storage_layers()[ColumnIndex::{self.name}]'''
+    return f'''{self.name}_storage_layer_'''
+
+  def null_layer_create(self) -> str:
+    if not self.is_optional or self.is_string:
+      return f'{{}}'
+    if self.is_ancestor:
+      return f'''const_parent_->null_layers()[ColumnIndex::{self.name}]'''
+    return f'''{self.name}_null_layer_'''
+
+  def storage_layer_init(self) -> str:
+    if self.is_ancestor:
+      return f''
+    if self.is_implicit_id:
+      return f'{self.name}_storage_layer_(new column::IdStorage())'
+    if self.is_string:
+      return f'''{self.name}_storage_layer_(
+          new column::StringStorage(string_pool(), &{self.name}_.vector()))'''
+    if ColumnFlag.SET_ID in self.flags:
+      return f'''{self.name}_storage_layer_(
+          new column::SetIdStorage(&{self.name}_.vector()))'''
+    if self.is_optional:
+      return f'''{self.name}_storage_layer_(
+          new column::NumericStorage<ColumnType::{self.name}::non_optional_stored_type>(
+            &{self.name}_.non_null_vector(),
+            ColumnTypeHelper<ColumnType::{self.name}::stored_type>::ToColumnType(),
+            {str(ColumnFlag.SORTED in self.flags).lower()}))'''
+    return f'''{self.name}_storage_layer_(
+        new column::NumericStorage<ColumnType::{self.name}::non_optional_stored_type>(
+          &{self.name}_.vector(),
+          ColumnTypeHelper<ColumnType::{self.name}::stored_type>::ToColumnType(),
+          {str(ColumnFlag.SORTED in self.flags).lower()}))'''
+
+  def null_layer_init(self) -> str:
+    if self.is_ancestor:
+      return f''
+    if not self.is_optional or self.is_string:
+      return f''
+    if ColumnFlag.DENSE in self.flags:
+      return f'''{self.name}_null_layer_(new column::DenseNullOverlay({self.name}_.bv()))'''
+    return f'''{self.name}_null_layer_(new column::NullOverlay({self.name}_.bv()))'''
+
 
 class TableSerializer(object):
   """Functions for seralizing a single Table into C++."""
@@ -272,7 +338,7 @@
     Id() = default;
     explicit constexpr Id(uint32_t v) : BaseId(v) {}
   };
-  static_assert(std::is_trivially_destructible<Id>::value,
+  static_assert(std::is_trivially_destructible_v<Id>,
                 "Inheritance used without trivial destruction");
     '''
 
@@ -313,7 +379,7 @@
 
     {row_ref_getters}
   }};
-  static_assert(std::is_trivially_destructible<ConstRowReference>::value,
+  static_assert(std::is_trivially_destructible_v<ConstRowReference>,
                 "Inheritance used without trivial destruction");
     '''
 
@@ -333,17 +399,24 @@
       return const_cast<{self.table_name}*>(table_);
     }}
   }};
-  static_assert(std::is_trivially_destructible<RowReference>::value,
+  static_assert(std::is_trivially_destructible_v<RowReference>,
                 "Inheritance used without trivial destruction");
     '''
 
   def constructor(self) -> str:
     storage_init = self.foreach_col(
         ColumnSerializer.storage_init, delimiter=',\n        ')
+    storage_layer_init = self.foreach_col(
+        ColumnSerializer.storage_layer_init, delimiter=',\n        ')
+    storage_layer_sep = '\n,' if storage_layer_init else ''
+    null_layer_init = self.foreach_col(
+        ColumnSerializer.null_layer_init, delimiter=',\n        ')
+    null_layer_sep = '\n,' if null_layer_init else ''
     if self.table.parent:
       parent_param = f', {self.parent_class_name}* parent'
       parent_arg = 'parent'
-      parent_init = 'parent_(parent)' + (', ' if storage_init else '')
+      parent_init = 'parent_(parent), const_parent_(parent)' + (
+          ', ' if storage_init else '')
     else:
       parent_param = ''
       parent_arg = 'nullptr'
@@ -353,6 +426,10 @@
       olay = 'uint32_t olay_idx = OverlayCount(parent);'
     else:
       olay = ''
+    storage_layer_create = self.foreach_col(
+        ColumnSerializer.storage_layer_create, delimiter=',')
+    null_layer_create = self.foreach_col(
+        ColumnSerializer.null_layer_create, delimiter=',')
     return f'''
   static std::vector<ColumnLegacy> GetColumns(
       {self.table_name}* self,
@@ -364,11 +441,18 @@
     return columns;
   }}
 
-  explicit {self.table_name}(StringPool* pool{parent_param})
-      : macros_internal::MacroTable(pool, GetColumns(this, {parent_arg}), {parent_arg}),
-        {parent_init}{storage_init} {{
+  PERFETTO_NO_INLINE explicit {self.table_name}(StringPool* pool{parent_param})
+      : macros_internal::MacroTable(
+          pool,
+          GetColumns(this, {parent_arg}),
+          {parent_arg}),
+        {parent_init}{storage_init}{storage_layer_sep}
+        {storage_layer_init}{null_layer_sep}
+        {null_layer_init} {{
     {self.foreach_col(ColumnSerializer.static_assert_flags)}
-    OnConstructionCompleted();
+    OnConstructionCompletedRegularConstructor(
+      {{{storage_layer_create}}},
+      {{{null_layer_create}}});
   }}
     '''
 
@@ -376,6 +460,7 @@
     if self.table.parent:
       return f'''
   {self.parent_class_name}* parent_ = nullptr;
+  const {self.parent_class_name}* const_parent_ = nullptr;
       '''
     return ''
 
@@ -422,20 +507,20 @@
     return f'''
   class Iterator : public ConstIterator {{
     public:
-    {iterator_setters}
+     {iterator_setters}
 
-    RowReference row_reference() const {{
-      return RowReference(mutable_table_, CurrentRowNumber());
-    }}
+     RowReference row_reference() const {{
+       return RowReference(mutable_table_, CurrentRowNumber());
+     }}
 
     private:
-    friend class {self.table_name};
+     friend class {self.table_name};
 
-    explicit Iterator({self.table_name}* table, Table::Iterator iterator)
+     explicit Iterator({self.table_name}* table, Table::Iterator iterator)
         : ConstIterator(table, std::move(iterator)),
           mutable_table_(table) {{}}
 
-    {self.table_name}* mutable_table_ = nullptr;
+     {self.table_name}* mutable_table_ = nullptr;
   }};
       '''
 
@@ -473,24 +558,63 @@
   def extend_constructor(self) -> str:
     if not self.table.parent:
       return ''
+    storage_layer_init = self.foreach_col(
+        ColumnSerializer.storage_layer_init, delimiter=',\n        ')
+    storage_layer_sep = '\n,' if storage_layer_init else ''
+    null_layer_init = self.foreach_col(
+        ColumnSerializer.null_layer_init, delimiter=',\n        ')
+    null_layer_sep = '\n,' if null_layer_init else ''
     params = self.foreach_col(
         ColumnSerializer.extend_parent_param, delimiter='\n, ')
+    storage_layer_create = self.foreach_col(
+        ColumnSerializer.storage_layer_create, delimiter=',')
+    null_layer_create = self.foreach_col(
+        ColumnSerializer.null_layer_create, delimiter=',')
     return f'''
   {self.table_name}(StringPool* pool,
             const {self.parent_class_name}& parent,
             const RowMap& parent_overlay{',' if params else ''}
             {params})
-      : macros_internal::MacroTable(pool, GetColumns(this, &parent), parent, parent_overlay) {{
+      : macros_internal::MacroTable(
+          pool,
+          GetColumns(this, &parent),
+          parent,
+          parent_overlay),
+          const_parent_(&parent){storage_layer_sep}
+        {storage_layer_init}{null_layer_sep}
+        {null_layer_init} {{
     {self.foreach_col(ColumnSerializer.static_assert_flags)}
     {self.foreach_col(ColumnSerializer.extend_nullable_vector)}
-    OnConstructionCompleted();
+
+    std::vector<RefPtr<column::DataLayer>> overlay_layers(OverlayCount(&parent) + 1);
+    for (uint32_t i = 0; i < overlay_layers.size(); ++i) {{
+      if (overlays()[i].row_map().IsIndexVector()) {{
+        overlay_layers[i].reset(new column::ArrangementOverlay(
+            overlays()[i].row_map().GetIfIndexVector(),
+            Indices::State::kNonmonotonic));
+      }} else if (overlays()[i].row_map().IsBitVector()) {{
+        overlay_layers[i].reset(new column::SelectorOverlay(
+            overlays()[i].row_map().GetIfBitVector()));
+      }} else if (overlays()[i].row_map().IsRange()) {{
+        overlay_layers[i].reset(new column::RangeOverlay(
+            overlays()[i].row_map().GetIfIRange()));
+      }}
+    }}
+
+    OnConstructionCompleted(
+      {{{storage_layer_create}}}, {{{null_layer_create}}}, std::move(overlay_layers));
   }}
     '''
 
+  def column_count(self) -> str:
+    return str(len(self.column_serializers))
+
   def serialize(self) -> str:
     return f'''
 class {self.table_name} : public macros_internal::MacroTable {{
  public:
+  static constexpr uint32_t kColumnCount = {self.column_count().strip()};
+
   {self.id_defn().lstrip()}
   struct ColumnIndex {{
     {self.foreach_col(ColumnSerializer.colindex)}
@@ -513,7 +637,7 @@
     explicit RowNumber(uint32_t row_number)
         : AbstractRowNumber(row_number) {{}}
   }};
-  static_assert(std::is_trivially_destructible<RowNumber>::value,
+  static_assert(std::is_trivially_destructible_v<RowNumber>,
                 "Inheritance used without trivial destruction");
 
   {self.const_row_reference_struct().strip()}
@@ -583,7 +707,7 @@
     {self.insert_common().strip()}
     {self.foreach_col(ColumnSerializer.append)}
     UpdateSelfOverlayAfterInsert();
-    return IdAndRow{{std::move(id), row_number, RowReference(this, row_number),
+    return IdAndRow{{id, row_number, RowReference(this, row_number),
                      RowNumber(row_number)}};
   }}
 
@@ -597,6 +721,10 @@
   {self.extend_constructor().strip()}
   {self.parent_field().strip()}
   {self.foreach_col(ColumnSerializer.storage)}
+
+  {self.foreach_col(ColumnSerializer.storage_layer)}
+
+  {self.foreach_col(ColumnSerializer.null_layer)}
 }};
   '''.strip('\n')
 
@@ -610,19 +738,45 @@
 #ifndef {ifdef_guard}
 #define {ifdef_guard}
 
+#include <array>
+#include <cstddef>
+#include <cstdint>
+#include <memory>
+#include <optional>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+#include "perfetto/base/logging.h"
+#include "perfetto/trace_processor/basic_types.h"
+#include "perfetto/trace_processor/ref_counted.h"
+#include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/containers/row_map.h"
+#include "src/trace_processor/containers/string_pool.h"
+#include "src/trace_processor/db/column/arrangement_overlay.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/dense_null_overlay.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
+#include "src/trace_processor/db/column/id_storage.h"
+#include "src/trace_processor/db/column/null_overlay.h"
+#include "src/trace_processor/db/column/range_overlay.h"
+#include "src/trace_processor/db/column/selector_overlay.h"
+#include "src/trace_processor/db/column/set_id_storage.h"
+#include "src/trace_processor/db/column/string_storage.h"
+#include "src/trace_processor/db/column/types.h"
+#include "src/trace_processor/db/column_storage.h"
+#include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/table.h"
 #include "src/trace_processor/db/typed_column.h"
+#include "src/trace_processor/db/typed_column_internal.h"
 #include "src/trace_processor/tables/macros_internal.h"
 
 {include_paths_str}
 
-namespace perfetto {{
-namespace trace_processor {{
-namespace tables {{
+namespace perfetto::trace_processor::tables {{
 
 {tables_str.strip()}
 
-}}  // namespace tables
-}}  // namespace trace_processor
 }}  // namespace perfetto
 
 #endif  // {ifdef_guard}
diff --git a/python/generators/trace_processor_table/util.py b/python/generators/trace_processor_table/util.py
index 9d5418a..444ec82 100644
--- a/python/generators/trace_processor_table/util.py
+++ b/python/generators/trace_processor_table/util.py
@@ -147,6 +147,19 @@
   return f'TypedColumn<{parsed.cpp_type_with_optionality()}>'
 
 
+def data_layer_type(table: Table, col: ParsedColumn) -> str:
+  """Returns the DataLayer C++ type for a given column."""
+
+  parsed = parse_type(table, col.column.type)
+  if col.is_implicit_id:
+    return 'column::IdStorage'
+  if parsed.cpp_type == 'StringPool::Id':
+    return 'column::StringStorage'
+  if ColumnFlag.SET_ID in col.column.flags:
+    return 'column::SetIdStorage'
+  return f'column::NumericStorage<ColumnType::{col.column.name}::non_optional_stored_type>'
+
+
 def find_table_deps(table: Table) -> List[Table]:
   """Finds all the other table class names this table depends on.
 
diff --git a/python/perfetto/trace_processor/metrics.descriptor b/python/perfetto/trace_processor/metrics.descriptor
index ec2847d..f77d217 100644
--- a/python/perfetto/trace_processor/metrics.descriptor
+++ b/python/perfetto/trace_processor/metrics.descriptor
Binary files differ
diff --git a/python/tools/check_ratchet.py b/python/tools/check_ratchet.py
index e8240d3..26e0800 100755
--- a/python/tools/check_ratchet.py
+++ b/python/tools/check_ratchet.py
@@ -36,7 +36,7 @@
 
 from dataclasses import dataclass
 
-EXPECTED_ANY_COUNT = 73
+EXPECTED_ANY_COUNT = 71
 EXPECTED_RUN_METRIC_COUNT = 5
 
 ROOT_DIR = os.path.dirname(
diff --git a/src/base/debug_crash_stack_trace.cc b/src/base/debug_crash_stack_trace.cc
index 4a16f29..9e1ef80 100644
--- a/src/base/debug_crash_stack_trace.cc
+++ b/src/base/debug_crash_stack_trace.cc
@@ -149,7 +149,11 @@
 
 #if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
     PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
-  auto bt_error = [](void*, const char* msg, int) { Print(msg); };
+  auto bt_error = [](void*, const char* msg, int) {
+    Print("libbacktrace error: ");
+    perfetto::base::WriteAll(STDERR_FILENO, msg, strlen(msg));
+    Print("\n");
+  };
   struct backtrace_state* bt_state =
       backtrace_create_state(nullptr, 0, bt_error, nullptr);
 #endif
diff --git a/src/base/uuid.cc b/src/base/uuid.cc
index 180a651..f335cfd 100644
--- a/src/base/uuid.cc
+++ b/src/base/uuid.cc
@@ -16,9 +16,11 @@
 
 #include "perfetto/ext/base/uuid.h"
 
+#include <mutex>
 #include <random>
 
 #include "perfetto/base/time.h"
+#include "perfetto/ext/base/no_destructor.h"
 
 namespace perfetto {
 namespace base {
@@ -51,6 +53,12 @@
   Uuid uuid;
   auto& data = *uuid.data();
 
+  // std::random is not thread safe and users of this class might mistakenly
+  // assume Uuidv4() is thread_safe because from the outside looks like a
+  // local object.
+  static base::NoDestructor<std::mutex> rand_mutex;
+  std::unique_lock<std::mutex> rand_lock(rand_mutex.ref());
+
   for (size_t i = 0; i < sizeof(data);) {
     // Note: the 32-th bit of rng() is always 0 as minstd_rand operates modulo
     // 2**31. Fill in blocks of 16b rather than 32b to not lose 1b of entropy.
diff --git a/src/kallsyms/kernel_symbol_map.cc b/src/kallsyms/kernel_symbol_map.cc
index b255213..4ff73d1 100644
--- a/src/kallsyms/kernel_symbol_map.cc
+++ b/src/kallsyms/kernel_symbol_map.cc
@@ -45,13 +45,16 @@
 namespace {
 
 using TokenId = KernelSymbolMap::TokenTable::TokenId;
+// TODO(rsavitski): the ToT kernel can supposedly contain symbols >255 bytes in
+// length (in particular due to Rust). Consider bumping this.
+// https://github.com/torvalds/linux/commit/73bbb94
 constexpr size_t kSymNameMaxLen = 128;
 constexpr size_t kSymMaxSizeBytes = 1024 * 1024;
 
 // Reads a kallsyms file in blocks of 4 pages each and decode its lines using
 // a simple FSM. Calls the passed lambda for each valid symbol.
 // It skips undefined symbols and other useless stuff.
-template <typename Lambda /* void(uint64_t, const char*) */>
+template <typename Lambda /* void(uint64_t, char, base::StringView) */>
 void ForEachSym(const std::string& kallsyms_path, Lambda fn) {
   base::ScopedFile fd = base::OpenFile(kallsyms_path.c_str(), O_RDONLY);
   if (!fd) {
@@ -119,8 +122,7 @@
             sym_name[sym_name_len++] = c;
             break;
           }
-          sym_name[sym_name_len] = '\0';
-          fn(sym_addr, sym_type, sym_name);
+          fn(sym_addr, sym_type, base::StringView(sym_name, sym_name_len));
           sym_addr = 0;
           sym_type = '\0';
           state = c == '\n' ? kSymAddr : kEatRestOfLine;
@@ -144,29 +146,26 @@
 // __fo_a_b_    ->  [_, fo, a, b, ""]
 // __fo_a_b____ ->  [_, fo, a, b, ___]
 template <typename Lambda /* void(base::StringView) */>
-void Tokenize(const char* name, Lambda fn) {
-  const char* tok_start = name;
-  bool is_start_of_token = true;
-  bool tok_is_sep = false;
-  for (const char* ptr = name;; ptr++) {
-    const char c = *ptr;
-    if (is_start_of_token) {
-      tok_is_sep = *tok_start == '_';  // Deals with tokens made of '_'s.
-      is_start_of_token = false;
-    }
-    // Scan until either the end of string or the next character (which is a '_'
-    // in nominal cases, or anything != '_' for tokens made by 1+ '_').
-    if (c == '\0' || (!tok_is_sep && c == '_') || (tok_is_sep && c != '_')) {
-      size_t tok_len = static_cast<size_t>(ptr - tok_start);
-      if (tok_is_sep && c != '\0')
-        --tok_len;
-      fn(base::StringView(tok_start, tok_len));
-      if (c == '\0')
-        return;
-      tok_start = tok_is_sep ? ptr : ptr + 1;
-      is_start_of_token = true;
+void Tokenize(const base::StringView name, Lambda fn) {
+  size_t tok_start = 0;
+  bool tok_is_sep = !name.empty() && name.at(tok_start) == '_';
+  for (size_t i = 0; i < name.size(); i++) {
+    char c = name.at(i);
+    // Scan until either the end of string or the next character (which is a
+    // '_' in nominal cases, or anything != '_' for tokens made by 1+ '_').
+    if (!tok_is_sep && c == '_') {
+      fn(name.substr(tok_start, i - tok_start));
+      tok_start = i + 1;
+      if (tok_start < name.size()) {
+        tok_is_sep = name.at(tok_start) == '_';
+      }
+    } else if (tok_is_sep && c != '_') {
+      fn(name.substr(tok_start, i - tok_start - 1));
+      tok_start = i;
+      tok_is_sep = false;
     }
   }
+  fn(name.substr(tok_start));  // last token
 }
 
 }  // namespace
@@ -264,10 +263,34 @@
   // Based on `cat /proc/kallsyms | egrep "\b[tT]\b" | wc -l`.
   symbol_tokens.reserve(128 * 1024);
 
-  ForEachSym(kallsyms_path, [&](SymAddr addr, char type, const char* name) {
-    if (addr == 0 || (type != 't' && type != 'T') || name[0] == '$') {
+  ForEachSym(kallsyms_path, [&](SymAddr addr, char type,
+                                base::StringView name) {
+    // Special cases:
+    //
+    // Skip arm mapping symbols such as $x, $x.123, $d, $d.123. They exist to
+    // delineate interleaved data and text for certain tools, and do not
+    // identify real functions. Should be fine to ignore on non-arm platforms
+    // since '$' isn't a valid C identifier and therefore unlikely to mark a
+    // real function.
+    //
+    // Strip .cfi/.cfi_jt suffixes if the kernel is built with clang control
+    // flow integrity checks (where for "my_func" there will be a
+    // "my_func.cfi_jt"). These can account for a third of the total symbols
+    // after the above filters, and tracing users want to see the unadorned
+    // name anyway. Normally we'd record the full string here and remove the
+    // suffix during trace ingestion, but it makes a nontrivial impact on the
+    // size of the in-memory token table since we tokenize only on underscore
+    // boundaries.
+    if (addr == 0 || (type != 't' && type != 'T') || name.at(0) == '$') {
       return;
     }
+    const base::StringView cfi = ".cfi";
+    const base::StringView cfi_jt = ".cfi_jt";
+    if (name.EndsWith(cfi)) {
+      name = name.substr(0, name.size() - cfi.size());
+    } else if (name.EndsWith(cfi_jt)) {
+      name = name.substr(0, name.size() - cfi_jt.size());
+    }
 
     // Split each symbol name in tokens, using '_' as a separator (so that
     // "foo_bar" -> ["foo", "bar"]). For each token hash:
diff --git a/src/kallsyms/kernel_symbol_map_unittest.cc b/src/kallsyms/kernel_symbol_map_unittest.cc
index 2bdb356..7a00bc0 100644
--- a/src/kallsyms/kernel_symbol_map_unittest.cc
+++ b/src/kallsyms/kernel_symbol_map_unittest.cc
@@ -108,7 +108,6 @@
   EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa20ULL), "two_");
   EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa30LL), "_three");
   EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa40ULL), "_fo_ur_");
-  EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa50ULL), "_five__.cfi");
   EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa60ULL), "__si__x__");
   EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa70ULL), "___se___v_e__n___");
   EXPECT_EQ(
@@ -124,7 +123,10 @@
   EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa71ULL), "___se___v_e__n___");
   EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa91ULL), "NiNe");
   EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa99ULL), "NiNe");
-  EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2faa0ULL), "tls_get.cfi_jt");
+
+  // We strip arm64 clang control flow integrity suffixes straight away.
+  EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa50ULL), "_five__");
+  EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2faa0ULL), "tls_get");
 
   // This is too far from the last symbol and should fail.
   EXPECT_EQ(kallsyms.Lookup(0xffffff8fffffffffULL), "");
diff --git a/src/kernel_utils/syscall_table.cc b/src/kernel_utils/syscall_table.cc
index eae0c4e..40bb835 100644
--- a/src/kernel_utils/syscall_table.cc
+++ b/src/kernel_utils/syscall_table.cc
@@ -28,14 +28,11 @@
 
 SyscallTable::SyscallTable(Architecture arch) {
   switch (arch) {
-    case Architecture::kArmEabi:
-      *this = SyscallTable::Load<SyscallTable_armeabi>();
+    case Architecture::kArm64:
+      *this = SyscallTable::Load<SyscallTable_arm64>();
       break;
-    case Architecture::kAarch32:
-      *this = SyscallTable::Load<SyscallTable_aarch32>();
-      break;
-    case Architecture::kAarch64:
-      *this = SyscallTable::Load<SyscallTable_aarch64>();
+    case Architecture::kArm32:
+      *this = SyscallTable::Load<SyscallTable_arm32>();
       break;
     case Architecture::kX86_64:
       *this = SyscallTable::Load<SyscallTable_x86_64>();
@@ -51,11 +48,10 @@
 
 Architecture SyscallTable::ArchFromString(base::StringView machine) {
   if (machine == "aarch64") {
-    return Architecture::kAarch64;
-  } else if (machine == "armv8l") {
-    return Architecture::kArmEabi;
-  } else if (machine == "armv7l") {
-    return Architecture::kAarch32;
+    return Architecture::kArm64;
+  } else if (machine == "armv8l" || machine == "armv7l") {
+    // armv8l is a 32 bit userspace process on a 64 bit kernel
+    return Architecture::kArm32;
   } else if (machine == "x86_64") {
     return Architecture::kX86_64;
   } else if (machine == "i686") {
diff --git a/src/kernel_utils/syscall_table.h b/src/kernel_utils/syscall_table.h
index c4fffe8..a80bc7b 100644
--- a/src/kernel_utils/syscall_table.h
+++ b/src/kernel_utils/syscall_table.h
@@ -29,9 +29,8 @@
 
 enum class Architecture {
   kUnknown = 0,
-  kArmEabi,  // 32-bit kernel running a 32-bit process (most old devices).
-  kAarch32,  // 64-bit kernel running a 32-bit process (should be rare).
-  kAarch64,  // 64-bit kernel running a 64-bit process (most new devices).
+  kArm64,
+  kArm32,
   kX86_64,
   kX86,
 };
diff --git a/src/kernel_utils/syscall_table_generated.h b/src/kernel_utils/syscall_table_generated.h
index ea44edc..d49b2c3 100644
--- a/src/kernel_utils/syscall_table_generated.h
+++ b/src/kernel_utils/syscall_table_generated.h
@@ -30,6 +30,7 @@
     "sys_bpf\0"
     "sys_break\0"
     "sys_brk\0"
+    "sys_cachestat\0"
     "sys_capget\0"
     "sys_capset\0"
     "sys_chdir\0"
@@ -38,12 +39,19 @@
     "sys_chown32\0"
     "sys_chroot\0"
     "sys_clock_adjtime\0"
+    "sys_clock_adjtime64\0"
     "sys_clock_getres\0"
+    "sys_clock_getres_time64\0"
     "sys_clock_gettime\0"
+    "sys_clock_gettime64\0"
     "sys_clock_nanosleep\0"
+    "sys_clock_nanosleep_time64\0"
     "sys_clock_settime\0"
+    "sys_clock_settime64\0"
     "sys_clone\0"
+    "sys_clone3\0"
     "sys_close\0"
+    "sys_close_range\0"
     "sys_connect\0"
     "sys_copy_file_range\0"
     "sys_creat\0"
@@ -57,6 +65,7 @@
     "sys_epoll_ctl\0"
     "sys_epoll_ctl_old\0"
     "sys_epoll_pwait\0"
+    "sys_epoll_pwait2\0"
     "sys_epoll_wait\0"
     "sys_epoll_wait_old\0"
     "sys_eventfd\0"
@@ -66,6 +75,7 @@
     "sys_exit\0"
     "sys_exit_group\0"
     "sys_faccessat\0"
+    "sys_faccessat2\0"
     "sys_fadvise64\0"
     "sys_fadvise64_64\0"
     "sys_fallocate\0"
@@ -74,6 +84,7 @@
     "sys_fchdir\0"
     "sys_fchmod\0"
     "sys_fchmodat\0"
+    "sys_fchmodat2\0"
     "sys_fchown\0"
     "sys_fchown32\0"
     "sys_fchownat\0"
@@ -86,7 +97,11 @@
     "sys_flock\0"
     "sys_fork\0"
     "sys_fremovexattr\0"
+    "sys_fsconfig\0"
     "sys_fsetxattr\0"
+    "sys_fsmount\0"
+    "sys_fsopen\0"
+    "sys_fspick\0"
     "sys_fstat\0"
     "sys_fstat64\0"
     "sys_fstatat\0"
@@ -98,6 +113,11 @@
     "sys_ftruncate\0"
     "sys_ftruncate64\0"
     "sys_futex\0"
+    "sys_futex_requeue\0"
+    "sys_futex_time64\0"
+    "sys_futex_wait\0"
+    "sys_futex_waitv\0"
+    "sys_futex_wake\0"
     "sys_futimesat\0"
     "sys_get_kernel_syms\0"
     "sys_get_mempolicy\0"
@@ -149,8 +169,12 @@
     "sys_io_destroy\0"
     "sys_io_getevents\0"
     "sys_io_pgetevents\0"
+    "sys_io_pgetevents_time64\0"
     "sys_io_setup\0"
     "sys_io_submit\0"
+    "sys_io_uring_enter\0"
+    "sys_io_uring_register\0"
+    "sys_io_uring_setup\0"
     "sys_ioctl\0"
     "sys_ioperm\0"
     "sys_iopl\0"
@@ -162,6 +186,9 @@
     "sys_kexec_load\0"
     "sys_keyctl\0"
     "sys_kill\0"
+    "sys_landlock_add_rule\0"
+    "sys_landlock_create_ruleset\0"
+    "sys_landlock_restrict_self\0"
     "sys_lchown\0"
     "sys_lchown32\0"
     "sys_lgetxattr\0"
@@ -178,9 +205,11 @@
     "sys_lstat\0"
     "sys_lstat64\0"
     "sys_madvise\0"
+    "sys_map_shadow_stack\0"
     "sys_mbind\0"
     "sys_membarrier\0"
     "sys_memfd_create\0"
+    "sys_memfd_secret\0"
     "sys_migrate_pages\0"
     "sys_mincore\0"
     "sys_mkdir\0"
@@ -194,6 +223,8 @@
     "sys_mmap2\0"
     "sys_modify_ldt\0"
     "sys_mount\0"
+    "sys_mount_setattr\0"
+    "sys_move_mount\0"
     "sys_move_pages\0"
     "sys_mprotect\0"
     "sys_mpx\0"
@@ -201,7 +232,9 @@
     "sys_mq_notify\0"
     "sys_mq_open\0"
     "sys_mq_timedreceive\0"
+    "sys_mq_timedreceive_time64\0"
     "sys_mq_timedsend\0"
+    "sys_mq_timedsend_time64\0"
     "sys_mq_unlink\0"
     "sys_mremap\0"
     "sys_msgctl\0"
@@ -224,13 +257,18 @@
     "sys_olduname\0"
     "sys_open\0"
     "sys_open_by_handle_at\0"
+    "sys_open_tree\0"
     "sys_openat\0"
+    "sys_openat2\0"
     "sys_pause\0"
     "sys_pciconfig_iobase\0"
     "sys_pciconfig_read\0"
     "sys_pciconfig_write\0"
     "sys_perf_event_open\0"
     "sys_personality\0"
+    "sys_pidfd_getfd\0"
+    "sys_pidfd_open\0"
+    "sys_pidfd_send_signal\0"
     "sys_pipe\0"
     "sys_pipe2\0"
     "sys_pivot_root\0"
@@ -239,16 +277,20 @@
     "sys_pkey_mprotect\0"
     "sys_poll\0"
     "sys_ppoll\0"
+    "sys_ppoll_time64\0"
     "sys_prctl\0"
     "sys_pread64\0"
     "sys_preadv\0"
     "sys_preadv2\0"
     "sys_prlimit64\0"
+    "sys_process_madvise\0"
+    "sys_process_mrelease\0"
     "sys_process_vm_readv\0"
     "sys_process_vm_writev\0"
     "sys_prof\0"
     "sys_profil\0"
     "sys_pselect6\0"
+    "sys_pselect6_time64\0"
     "sys_ptrace\0"
     "sys_putpmsg\0"
     "sys_pwrite64\0"
@@ -256,6 +298,7 @@
     "sys_pwritev2\0"
     "sys_query_module\0"
     "sys_quotactl\0"
+    "sys_quotactl_fd\0"
     "sys_read\0"
     "sys_readahead\0"
     "sys_readdir\0"
@@ -266,6 +309,7 @@
     "sys_recv\0"
     "sys_recvfrom\0"
     "sys_recvmmsg\0"
+    "sys_recvmmsg_time64\0"
     "sys_recvmsg\0"
     "sys_remap_file_pages\0"
     "sys_removexattr\0"
@@ -283,6 +327,7 @@
     "sys_rt_sigreturn\0"
     "sys_rt_sigsuspend\0"
     "sys_rt_sigtimedwait\0"
+    "sys_rt_sigtimedwait_time64\0"
     "sys_rt_tgsigqueueinfo\0"
     "sys_sched_get_priority_max\0"
     "sys_sched_get_priority_min\0"
@@ -291,6 +336,7 @@
     "sys_sched_getparam\0"
     "sys_sched_getscheduler\0"
     "sys_sched_rr_get_interval\0"
+    "sys_sched_rr_get_interval_time64\0"
     "sys_sched_setaffinity\0"
     "sys_sched_setattr\0"
     "sys_sched_setparam\0"
@@ -303,6 +349,7 @@
     "sys_semget\0"
     "sys_semop\0"
     "sys_semtimedop\0"
+    "sys_semtimedop_time64\0"
     "sys_send\0"
     "sys_sendfile\0"
     "sys_sendfile64\0"
@@ -310,6 +357,7 @@
     "sys_sendmsg\0"
     "sys_sendto\0"
     "sys_set_mempolicy\0"
+    "sys_set_mempolicy_home_node\0"
     "sys_set_robust_list\0"
     "sys_set_thread_area\0"
     "sys_set_tid_address\0"
@@ -375,7 +423,6 @@
     "sys_symlinkat\0"
     "sys_sync\0"
     "sys_sync_file_range\0"
-    "sys_sync_file_range2\0"
     "sys_syncfs\0"
     "sys_syscall\0"
     "sys_sysfs\0"
@@ -388,10 +435,14 @@
     "sys_timer_delete\0"
     "sys_timer_getoverrun\0"
     "sys_timer_gettime\0"
+    "sys_timer_gettime64\0"
     "sys_timer_settime\0"
+    "sys_timer_settime64\0"
     "sys_timerfd_create\0"
     "sys_timerfd_gettime\0"
+    "sys_timerfd_gettime64\0"
     "sys_timerfd_settime\0"
+    "sys_timerfd_settime64\0"
     "sys_times\0"
     "sys_tkill\0"
     "sys_truncate\0"
@@ -411,6 +462,7 @@
     "sys_ustat\0"
     "sys_utime\0"
     "sys_utimensat\0"
+    "sys_utimensat_time64\0"
     "sys_utimes\0"
     "sys_vfork\0"
     "sys_vhangup\0"
@@ -424,658 +476,253 @@
     "sys_write\0"
     "sys_writev\0";
 
-struct SyscallTable_aarch32 {
+struct SyscallTable_arm64 {
   static constexpr const char* names = kAllSyscalllNames;
   static constexpr SyscallTable::OffT offsets[]{
-      3544,  // 0: sys_restart_syscall
-      723,   // 1: sys_exit
-      1006,  // 2: sys_fork
-      3322,  // 3: sys_read
-      5639,  // 4: sys_write
-      2848,  // 5: sys_open
-      443,   // 6: sys_close
-      0,     // 7:
-      485,   // 8: sys_creat
-      2115,  // 9: sys_link
-      5430,  // 10: sys_unlink
-      699,   // 11: sys_execve
-      289,   // 12: sys_chdir
-      0,     // 13:
-      2372,  // 14: sys_mknod
-      299,   // 15: sys_chmod
-      2077,  // 16: sys_lchown
-      0,     // 17:
-      0,     // 18:
-      2220,  // 19: sys_lseek
-      1482,  // 20: sys_getpid
-      2462,  // 21: sys_mount
-      0,     // 22:
-      4597,  // 23: sys_setuid
-      1705,  // 24: sys_getuid
-      0,     // 25:
-      3231,  // 26: sys_ptrace
-      0,     // 27:
-      0,     // 28:
-      2890,  // 29: sys_pause
-      0,     // 30:
-      0,     // 31:
-      0,     // 32:
-      63,    // 33: sys_access
-      2772,  // 34: sys_nice
-      0,     // 35:
-      5017,  // 36: sys_sync
-      2068,  // 37: sys_kill
-      3490,  // 38: sys_rename
-      2350,  // 39: sys_mkdir
-      3564,  // 40: sys_rmdir
-      531,   // 41: sys_dup
-      2996,  // 42: sys_pipe
-      5301,  // 43: sys_times
-      0,     // 44:
-      259,   // 45: sys_brk
-      4302,  // 46: sys_setgid
-      1374,  // 47: sys_getgid
-      0,     // 48:
-      1348,  // 49: sys_geteuid
-      1322,  // 50: sys_getegid
-      74,    // 51: sys_acct
-      5408,  // 52: sys_umount2
-      0,     // 53:
-      1945,  // 54: sys_ioctl
-      914,   // 55: sys_fcntl
-      0,     // 56:
-      4396,  // 57: sys_setpgid
-      0,     // 58:
-      0,     // 59:
-      5387,  // 60: sys_umask
-      331,   // 61: sys_chroot
-      5493,  // 62: sys_ustat
-      539,   // 63: sys_dup2
-      1505,  // 64: sys_getppid
-      1470,  // 65: sys_getpgrp
-      4554,  // 66: sys_setsid
-      4702,  // 67: sys_sigaction
-      0,     // 68:
-      0,     // 69:
-      4512,  // 70: sys_setreuid
-      4424,  // 71: sys_setregid
-      4815,  // 72: sys_sigsuspend
-      4770,  // 73: sys_sigpending
-      4356,  // 74: sys_sethostname
-      4540,  // 75: sys_setrlimit
-      0,     // 76:
-      1621,  // 77: sys_getrusage
-      1688,  // 78: sys_gettimeofday
-      4580,  // 79: sys_settimeofday
-      1398,  // 80: sys_getgroups
-      4326,  // 81: sys_setgroups
-      0,     // 82:
-      4991,  // 83: sys_symlink
-      0,     // 84:
-      3357,  // 85: sys_readlink
-      5466,  // 86: sys_uselib
-      4980,  // 87: sys_swapon
-      3395,  // 88: sys_reboot
-      0,     // 89:
-      0,     // 90:
-      2695,  // 91: sys_munmap
-      5321,  // 92: sys_truncate
-      1140,  // 93: sys_ftruncate
-      853,   // 94: sys_fchmod
-      877,   // 95: sys_fchown
-      1517,  // 96: sys_getpriority
-      4408,  // 97: sys_setpriority
-      0,     // 98:
-      4915,  // 99: sys_statfs
-      1094,  // 100: sys_fstatfs
-      0,     // 101:
-      0,     // 102:
-      5112,  // 103: sys_syslog
-      4372,  // 104: sys_setitimer
-      1428,  // 105: sys_getitimer
-      4895,  // 106: sys_stat
-      2244,  // 107: sys_lstat
-      1046,  // 108: sys_fstat
-      0,     // 109:
-      0,     // 110:
-      5548,  // 111: sys_vhangup
-      0,     // 112:
-      0,     // 113:
-      5606,  // 114: sys_wait4
-      4968,  // 115: sys_swapoff
-      5100,  // 116: sys_sysinfo
-      0,     // 117:
-      1120,  // 118: sys_fsync
-      4801,  // 119: sys_sigreturn
-      433,   // 120: sys_clone
-      4228,  // 121: sys_setdomainname
-      5420,  // 122: sys_uname
-      0,     // 123:
-      95,    // 124: sys_adjtimex
-      2487,  // 125: sys_mprotect
-      4785,  // 126: sys_sigprocmask
-      0,     // 127:
-      1760,  // 128: sys_init_module
-      513,   // 129: sys_delete_module
-      0,     // 130:
-      3309,  // 131: sys_quotactl
-      1458,  // 132: sys_getpgid
-      842,   // 133: sys_fchdir
-      220,   // 134: sys_bdflush
-      5090,  // 135: sys_sysfs
-      2980,  // 136: sys_personality
-      0,     // 137:
-      4274,  // 138: sys_setfsuid
-      4246,  // 139: sys_setfsgid
-      1,     // 140: sys__llseek
-      1294,  // 141: sys_getdents
-      13,    // 142: sys__newselect
-      996,   // 143: sys_flock
-      2658,  // 144: sys_msync
-      3385,  // 145: sys_readv
-      5649,  // 146: sys_writev
-      1635,  // 147: sys_getsid
-      936,   // 148: sys_fdatasync
-      28,    // 149: sys__sysctl
-      2394,  // 150: sys_mlock
-      2668,  // 151: sys_munlock
-      2415,  // 152: sys_mlockall
-      2680,  // 153: sys_munlockall
-      3936,  // 154: sys_sched_setparam
-      3828,  // 155: sys_sched_getparam
-      3955,  // 156: sys_sched_setscheduler
-      3847,  // 157: sys_sched_getscheduler
-      3978,  // 158: sys_sched_yield
-      3734,  // 159: sys_sched_get_priority_max
-      3761,  // 160: sys_sched_get_priority_min
-      3870,  // 161: sys_sched_rr_get_interval
-      2728,  // 162: sys_nanosleep
-      2603,  // 163: sys_mremap
-      4482,  // 164: sys_setresuid
-      1577,  // 165: sys_getresuid
-      0,     // 166:
-      0,     // 167:
-      3077,  // 168: sys_poll
-      2757,  // 169: sys_nfsservctl
-      4452,  // 170: sys_setresgid
-      1547,  // 171: sys_getresgid
-      3096,  // 172: sys_prctl
-      3657,  // 173: sys_rt_sigreturn
-      3583,  // 174: sys_rt_sigaction
-      3618,  // 175: sys_rt_sigprocmask
-      3600,  // 176: sys_rt_sigpending
-      3692,  // 177: sys_rt_sigtimedwait
-      3637,  // 178: sys_rt_sigqueueinfo
-      3674,  // 179: sys_rt_sigsuspend
-      3106,  // 180: sys_pread64
-      3254,  // 181: sys_pwrite64
-      309,   // 182: sys_chown
-      1283,  // 183: sys_getcwd
-      267,   // 184: sys_capget
-      278,   // 185: sys_capset
-      4716,  // 186: sys_sigaltstack
-      4086,  // 187: sys_sendfile
-      0,     // 188:
-      0,     // 189:
-      5538,  // 190: sys_vfork
-      0,     // 191:
-      2437,  // 192: sys_mmap2
-      5334,  // 193: sys_truncate64
-      1154,  // 194: sys_ftruncate64
-      4904,  // 195: sys_stat64
-      2254,  // 196: sys_lstat64
-      1056,  // 197: sys_fstat64
-      2088,  // 198: sys_lchown32
-      1716,  // 199: sys_getuid32
-      1385,  // 200: sys_getgid32
-      1360,  // 201: sys_geteuid32
-      1334,  // 202: sys_getegid32
-      4525,  // 203: sys_setreuid32
-      4437,  // 204: sys_setregid32
-      1412,  // 205: sys_getgroups32
-      4340,  // 206: sys_setgroups32
-      888,   // 207: sys_fchown32
-      4496,  // 208: sys_setresuid32
-      1591,  // 209: sys_getresuid32
-      4466,  // 210: sys_setresgid32
-      1561,  // 211: sys_getresgid32
-      319,   // 212: sys_chown32
-      4608,  // 213: sys_setuid32
-      4313,  // 214: sys_setgid32
-      4287,  // 215: sys_setfsuid32
-      4259,  // 216: sys_setfsgid32
-      1307,  // 217: sys_getdents64
-      3015,  // 218: sys_pivot_root
-      2338,  // 219: sys_mincore
-      2266,  // 220: sys_madvise
-      924,   // 221: sys_fcntl64
-      0,     // 222:
-      0,     // 223:
-      1677,  // 224: sys_gettid
-      3331,  // 225: sys_readahead
-      4621,  // 226: sys_setxattr
-      2230,  // 227: sys_lsetxattr
-      1032,  // 228: sys_fsetxattr
-      1729,  // 229: sys_getxattr
-      2101,  // 230: sys_lgetxattr
-      950,   // 231: sys_fgetxattr
-      2146,  // 232: sys_listxattr
-      2160,  // 233: sys_llistxattr
-      981,   // 234: sys_flistxattr
-      3474,  // 235: sys_removexattr
-      2203,  // 236: sys_lremovexattr
-      1015,  // 237: sys_fremovexattr
-      5311,  // 238: sys_tkill
-      4099,  // 239: sys_sendfile64
-      1170,  // 240: sys_futex
-      3896,  // 241: sys_sched_setaffinity
-      3788,  // 242: sys_sched_getaffinity
-      1918,  // 243: sys_io_setup
-      1868,  // 244: sys_io_destroy
-      1883,  // 245: sys_io_getevents
-      1931,  // 246: sys_io_submit
-      1854,  // 247: sys_io_cancel
-      732,   // 248: sys_exit_group
-      2184,  // 249: sys_lookup_dcookie
-      557,   // 250: sys_epoll_create
-      592,   // 251: sys_epoll_ctl
-      640,   // 252: sys_epoll_wait
-      3453,  // 253: sys_remap_file_pages
-      0,     // 254:
-      0,     // 255:
-      4208,  // 256: sys_set_tid_address
-      5151,  // 257: sys_timer_create
-      5224,  // 258: sys_timer_settime
-      5206,  // 259: sys_timer_gettime
-      5185,  // 260: sys_timer_getoverrun
-      5168,  // 261: sys_timer_delete
-      415,   // 262: sys_clock_settime
-      377,   // 263: sys_clock_gettime
-      360,   // 264: sys_clock_getres
-      395,   // 265: sys_clock_nanosleep
-      4926,  // 266: sys_statfs64
-      1106,  // 267: sys_fstatfs64
-      5131,  // 268: sys_tgkill
-      5527,  // 269: sys_utimes
-      175,   // 270: sys_arm_fadvise64_64
-      2900,  // 271: sys_pciconfig_iobase
-      2921,  // 272: sys_pciconfig_read
-      2940,  // 273: sys_pciconfig_write
-      2540,  // 274: sys_mq_open
-      2589,  // 275: sys_mq_unlink
-      2572,  // 276: sys_mq_timedsend
-      2552,  // 277: sys_mq_timedreceive
-      2526,  // 278: sys_mq_notify
-      2508,  // 279: sys_mq_getsetattr
-      5616,  // 280: sys_waitid
-      4830,  // 281: sys_socket
-      232,   // 282: sys_bind
-      453,   // 283: sys_connect
-      2135,  // 284: sys_listen
-      40,    // 285: sys_accept
-      1646,  // 286: sys_getsockname
-      1442,  // 287: sys_getpeername
-      4856,  // 288: sys_socketpair
-      4077,  // 289: sys_send
-      4139,  // 290: sys_sendto
-      3406,  // 291: sys_recv
-      3415,  // 292: sys_recvfrom
-      4689,  // 293: sys_shutdown
-      4565,  // 294: sys_setsockopt
-      1662,  // 295: sys_getsockopt
-      4127,  // 296: sys_sendmsg
-      3441,  // 297: sys_recvmsg
-      4052,  // 298: sys_semop
-      4041,  // 299: sys_semget
-      4030,  // 300: sys_semctl
-      2647,  // 301: sys_msgsnd
-      2636,  // 302: sys_msgrcv
-      2625,  // 303: sys_msgget
-      2614,  // 304: sys_msgctl
-      4647,  // 305: sys_shmat
-      4668,  // 306: sys_shmdt
-      4678,  // 307: sys_shmget
-      4657,  // 308: sys_shmctl
-      83,    // 309: sys_add_key
-      3528,  // 310: sys_request_key
-      2057,  // 311: sys_keyctl
-      4062,  // 312: sys_semtimedop
-      5594,  // 313: sys_vserver
-      1990,  // 314: sys_ioprio_set
-      1975,  // 315: sys_ioprio_get
-      1798,  // 316: sys_inotify_init
-      1776,  // 317: sys_inotify_add_watch
-      1833,  // 318: sys_inotify_rm_watch
-      2278,  // 319: sys_mbind
-      1214,  // 320: sys_get_mempolicy
-      4150,  // 321: sys_set_mempolicy
-      2879,  // 322: sys_openat
-      2360,  // 323: sys_mkdirat
-      2382,  // 324: sys_mknodat
-      901,   // 325: sys_fchownat
-      1180,  // 326: sys_futimesat
-      1080,  // 327: sys_fstatat64
-      5441,  // 328: sys_unlinkat
-      3501,  // 329: sys_renameat
-      2124,  // 330: sys_linkat
-      5003,  // 331: sys_symlinkat
-      3370,  // 332: sys_readlinkat
-      864,   // 333: sys_fchmodat
-      747,   // 334: sys_faccessat
-      3218,  // 335: sys_pselect6
-      3086,  // 336: sys_ppoll
-      5454,  // 337: sys_unshare
-      4168,  // 338: sys_set_robust_list
-      1232,  // 339: sys_get_robust_list
-      4871,  // 340: sys_splice
-      5046,  // 341: sys_sync_file_range2
-      5123,  // 342: sys_tee
-      5581,  // 343: sys_vmsplice
-      2472,  // 344: sys_move_pages
-      1272,  // 345: sys_getcpu
-      624,   // 346: sys_epoll_pwait
-      2042,  // 347: sys_kexec_load
-      5513,  // 348: sys_utimensat
-      4743,  // 349: sys_signalfd
-      5242,  // 350: sys_timerfd_create
-      674,   // 351: sys_eventfd
-      792,   // 352: sys_fallocate
-      5281,  // 353: sys_timerfd_settime
-      5261,  // 354: sys_timerfd_gettime
-      4756,  // 355: sys_signalfd4
-      686,   // 356: sys_eventfd2
-      574,   // 357: sys_epoll_create1
-      548,   // 358: sys_dup3
-      3005,  // 359: sys_pipe2
-      1815,  // 360: sys_inotify_init1
-      3118,  // 361: sys_preadv
-      3267,  // 362: sys_pwritev
-      3712,  // 363: sys_rt_tgsigqueueinfo
-      2960,  // 364: sys_perf_event_open
-      3428,  // 365: sys_recvmmsg
-      51,    // 366: sys_accept4
-      806,   // 367: sys_fanotify_init
-      824,   // 368: sys_fanotify_mark
-      3141,  // 369: sys_prlimit64
-      2706,  // 370: sys_name_to_handle_at
-      2857,  // 371: sys_open_by_handle_at
-      342,   // 372: sys_clock_adjtime
-      5067,  // 373: sys_syncfs
-      4114,  // 374: sys_sendmmsg
-      4386,  // 375: sys_setns
-      3155,  // 376: sys_process_vm_readv
-      3176,  // 377: sys_process_vm_writev
-      2013,  // 378: sys_kcmp
-      964,   // 379: sys_finit_module
-      3918,  // 380: sys_sched_setattr
-      3810,  // 381: sys_sched_getattr
-      3514,  // 382: sys_renameat2
-      3994,  // 383: sys_seccomp
-      1533,  // 384: sys_getrandom
-      2303,  // 385: sys_memfd_create
-      241,   // 386: sys_bpf
-      710,   // 387: sys_execveat
-      5477,  // 388: sys_userfaultfd
-      2288,  // 389: sys_membarrier
-      2404,  // 390: sys_mlock2
-      465,   // 391: sys_copy_file_range
-      3129,  // 392: sys_preadv2
-      3279,  // 393: sys_pwritev2
-      3059,  // 394: sys_pkey_mprotect
-      3030,  // 395: sys_pkey_alloc
-      3045,  // 396: sys_pkey_free
-      4939,  // 397: sys_statx
-      3574,  // 398: sys_rseq
-  };
-};
-
-struct SyscallTable_aarch64 {
-  static constexpr const char* names = kAllSyscalllNames;
-  static constexpr SyscallTable::OffT offsets[]{
-      1918,  // 0: sys_io_setup
-      1868,  // 1: sys_io_destroy
-      1931,  // 2: sys_io_submit
-      1854,  // 3: sys_io_cancel
-      1883,  // 4: sys_io_getevents
-      4621,  // 5: sys_setxattr
-      2230,  // 6: sys_lsetxattr
-      1032,  // 7: sys_fsetxattr
-      1729,  // 8: sys_getxattr
-      2101,  // 9: sys_lgetxattr
-      950,   // 10: sys_fgetxattr
-      2146,  // 11: sys_listxattr
-      2160,  // 12: sys_llistxattr
-      981,   // 13: sys_flistxattr
-      3474,  // 14: sys_removexattr
-      2203,  // 15: sys_lremovexattr
-      1015,  // 16: sys_fremovexattr
-      1283,  // 17: sys_getcwd
-      2184,  // 18: sys_lookup_dcookie
-      686,   // 19: sys_eventfd2
-      574,   // 20: sys_epoll_create1
-      592,   // 21: sys_epoll_ctl
-      624,   // 22: sys_epoll_pwait
-      531,   // 23: sys_dup
-      548,   // 24: sys_dup3
-      914,   // 25: sys_fcntl
-      1815,  // 26: sys_inotify_init1
-      1776,  // 27: sys_inotify_add_watch
-      1833,  // 28: sys_inotify_rm_watch
-      1945,  // 29: sys_ioctl
-      1990,  // 30: sys_ioprio_set
-      1975,  // 31: sys_ioprio_get
-      996,   // 32: sys_flock
-      2382,  // 33: sys_mknodat
-      2360,  // 34: sys_mkdirat
-      5441,  // 35: sys_unlinkat
-      5003,  // 36: sys_symlinkat
-      2124,  // 37: sys_linkat
-      3501,  // 38: sys_renameat
-      5408,  // 39: sys_umount2
-      2462,  // 40: sys_mount
-      3015,  // 41: sys_pivot_root
-      2757,  // 42: sys_nfsservctl
-      4915,  // 43: sys_statfs
-      1094,  // 44: sys_fstatfs
-      5321,  // 45: sys_truncate
-      1140,  // 46: sys_ftruncate
-      792,   // 47: sys_fallocate
-      747,   // 48: sys_faccessat
-      289,   // 49: sys_chdir
-      842,   // 50: sys_fchdir
-      331,   // 51: sys_chroot
-      853,   // 52: sys_fchmod
-      864,   // 53: sys_fchmodat
-      901,   // 54: sys_fchownat
-      877,   // 55: sys_fchown
-      2879,  // 56: sys_openat
-      443,   // 57: sys_close
-      5548,  // 58: sys_vhangup
-      3005,  // 59: sys_pipe2
-      3309,  // 60: sys_quotactl
-      1307,  // 61: sys_getdents64
-      2220,  // 62: sys_lseek
-      3322,  // 63: sys_read
-      5639,  // 64: sys_write
-      3385,  // 65: sys_readv
-      5649,  // 66: sys_writev
-      3106,  // 67: sys_pread64
-      3254,  // 68: sys_pwrite64
-      3118,  // 69: sys_preadv
-      3267,  // 70: sys_pwritev
-      4086,  // 71: sys_sendfile
-      3218,  // 72: sys_pselect6
-      3086,  // 73: sys_ppoll
-      4756,  // 74: sys_signalfd4
-      5581,  // 75: sys_vmsplice
-      4871,  // 76: sys_splice
-      5123,  // 77: sys_tee
-      3370,  // 78: sys_readlinkat
-      1068,  // 79: sys_fstatat
-      1046,  // 80: sys_fstat
-      5017,  // 81: sys_sync
-      1120,  // 82: sys_fsync
-      936,   // 83: sys_fdatasync
-      5026,  // 84: sys_sync_file_range
-      5242,  // 85: sys_timerfd_create
-      5281,  // 86: sys_timerfd_settime
-      5261,  // 87: sys_timerfd_gettime
-      5513,  // 88: sys_utimensat
+      2269,  // 0: sys_io_setup
+      2194,  // 1: sys_io_destroy
+      2282,  // 2: sys_io_submit
+      2180,  // 3: sys_io_cancel
+      2209,  // 4: sys_io_getevents
+      5534,  // 5: sys_setxattr
+      2718,  // 6: sys_lsetxattr
+      1243,  // 7: sys_fsetxattr
+      2055,  // 8: sys_getxattr
+      2589,  // 9: sys_lgetxattr
+      1148,  // 10: sys_fgetxattr
+      2634,  // 11: sys_listxattr
+      2648,  // 12: sys_llistxattr
+      1179,  // 13: sys_flistxattr
+      4277,  // 14: sys_removexattr
+      2691,  // 15: sys_lremovexattr
+      1213,  // 16: sys_fremovexattr
+      1609,  // 17: sys_getcwd
+      2672,  // 18: sys_lookup_dcookie
+      855,   // 19: sys_eventfd2
+      726,   // 20: sys_epoll_create1
+      744,   // 21: sys_epoll_ctl
+      776,   // 22: sys_epoll_pwait
+      683,   // 23: sys_dup
+      700,   // 24: sys_dup3
+      1112,  // 25: sys_fcntl
+      2141,  // 26: sys_inotify_init1
+      2102,  // 27: sys_inotify_add_watch
+      2159,  // 28: sys_inotify_rm_watch
+      2356,  // 29: sys_ioctl
+      2401,  // 30: sys_ioprio_set
+      2386,  // 31: sys_ioprio_get
+      1194,  // 32: sys_flock
+      2908,  // 33: sys_mknodat
+      2886,  // 34: sys_mkdirat
+      6417,  // 35: sys_unlinkat
+      5916,  // 36: sys_symlinkat
+      2612,  // 37: sys_linkat
+      4304,  // 38: sys_renameat
+      6384,  // 39: sys_umount2
+      2988,  // 40: sys_mount
+      3704,  // 41: sys_pivot_root
+      3367,  // 42: sys_nfsservctl
+      5828,  // 43: sys_statfs
+      1339,  // 44: sys_fstatfs
+      6297,  // 45: sys_truncate
+      1385,  // 46: sys_ftruncate
+      976,   // 47: sys_fallocate
+      916,   // 48: sys_faccessat
+      303,   // 49: sys_chdir
+      1026,  // 50: sys_fchdir
+      345,   // 51: sys_chroot
+      1037,  // 52: sys_fchmod
+      1048,  // 53: sys_fchmodat
+      1099,  // 54: sys_fchownat
+      1075,  // 55: sys_fchown
+      3503,  // 56: sys_openat
+      579,   // 57: sys_close
+      6545,  // 58: sys_vhangup
+      3694,  // 59: sys_pipe2
+      4076,  // 60: sys_quotactl
+      1633,  // 61: sys_getdents64
+      2708,  // 62: sys_lseek
+      4105,  // 63: sys_read
+      6636,  // 64: sys_write
+      4168,  // 65: sys_readv
+      6646,  // 66: sys_writev
+      3812,  // 67: sys_pread64
+      4021,  // 68: sys_pwrite64
+      3824,  // 69: sys_preadv
+      4034,  // 70: sys_pwritev
+      4971,  // 71: sys_sendfile
+      3965,  // 72: sys_pselect6
+      3775,  // 73: sys_ppoll
+      5669,  // 74: sys_signalfd4
+      6578,  // 75: sys_vmsplice
+      5784,  // 76: sys_splice
+      6015,  // 77: sys_tee
+      4153,  // 78: sys_readlinkat
+      1313,  // 79: sys_fstatat
+      1291,  // 80: sys_fstat
+      5930,  // 81: sys_sync
+      1365,  // 82: sys_fsync
+      1134,  // 83: sys_fdatasync
+      5939,  // 84: sys_sync_file_range
+      6174,  // 85: sys_timerfd_create
+      6235,  // 86: sys_timerfd_settime
+      6193,  // 87: sys_timerfd_gettime
+      6489,  // 88: sys_utimensat
       74,    // 89: sys_acct
-      267,   // 90: sys_capget
-      278,   // 91: sys_capset
-      2980,  // 92: sys_personality
-      723,   // 93: sys_exit
-      732,   // 94: sys_exit_group
-      5616,  // 95: sys_waitid
-      4208,  // 96: sys_set_tid_address
-      5454,  // 97: sys_unshare
-      1170,  // 98: sys_futex
-      4168,  // 99: sys_set_robust_list
-      1232,  // 100: sys_get_robust_list
-      2728,  // 101: sys_nanosleep
-      1428,  // 102: sys_getitimer
-      4372,  // 103: sys_setitimer
-      2042,  // 104: sys_kexec_load
-      1760,  // 105: sys_init_module
-      513,   // 106: sys_delete_module
-      5151,  // 107: sys_timer_create
-      5206,  // 108: sys_timer_gettime
-      5185,  // 109: sys_timer_getoverrun
-      5224,  // 110: sys_timer_settime
-      5168,  // 111: sys_timer_delete
-      415,   // 112: sys_clock_settime
-      377,   // 113: sys_clock_gettime
-      360,   // 114: sys_clock_getres
-      395,   // 115: sys_clock_nanosleep
-      5112,  // 116: sys_syslog
-      3231,  // 117: sys_ptrace
-      3936,  // 118: sys_sched_setparam
-      3955,  // 119: sys_sched_setscheduler
-      3847,  // 120: sys_sched_getscheduler
-      3828,  // 121: sys_sched_getparam
-      3896,  // 122: sys_sched_setaffinity
-      3788,  // 123: sys_sched_getaffinity
-      3978,  // 124: sys_sched_yield
-      3734,  // 125: sys_sched_get_priority_max
-      3761,  // 126: sys_sched_get_priority_min
-      3870,  // 127: sys_sched_rr_get_interval
-      3544,  // 128: sys_restart_syscall
-      2068,  // 129: sys_kill
-      5311,  // 130: sys_tkill
-      5131,  // 131: sys_tgkill
-      4716,  // 132: sys_sigaltstack
-      3674,  // 133: sys_rt_sigsuspend
-      3583,  // 134: sys_rt_sigaction
-      3618,  // 135: sys_rt_sigprocmask
-      3600,  // 136: sys_rt_sigpending
-      3692,  // 137: sys_rt_sigtimedwait
-      3637,  // 138: sys_rt_sigqueueinfo
-      3657,  // 139: sys_rt_sigreturn
-      4408,  // 140: sys_setpriority
-      1517,  // 141: sys_getpriority
-      3395,  // 142: sys_reboot
-      4424,  // 143: sys_setregid
-      4302,  // 144: sys_setgid
-      4512,  // 145: sys_setreuid
-      4597,  // 146: sys_setuid
-      4482,  // 147: sys_setresuid
-      1577,  // 148: sys_getresuid
-      4452,  // 149: sys_setresgid
-      1547,  // 150: sys_getresgid
-      4274,  // 151: sys_setfsuid
-      4246,  // 152: sys_setfsgid
-      5301,  // 153: sys_times
-      4396,  // 154: sys_setpgid
-      1458,  // 155: sys_getpgid
-      1635,  // 156: sys_getsid
-      4554,  // 157: sys_setsid
-      1398,  // 158: sys_getgroups
-      4326,  // 159: sys_setgroups
-      5420,  // 160: sys_uname
-      4356,  // 161: sys_sethostname
-      4228,  // 162: sys_setdomainname
-      1607,  // 163: sys_getrlimit
-      4540,  // 164: sys_setrlimit
-      1621,  // 165: sys_getrusage
-      5387,  // 166: sys_umask
-      3096,  // 167: sys_prctl
-      1272,  // 168: sys_getcpu
-      1688,  // 169: sys_gettimeofday
-      4580,  // 170: sys_settimeofday
+      281,   // 90: sys_capget
+      292,   // 91: sys_capset
+      3616,  // 92: sys_personality
+      892,   // 93: sys_exit
+      901,   // 94: sys_exit_group
+      6613,  // 95: sys_waitid
+      5121,  // 96: sys_set_tid_address
+      6430,  // 97: sys_unshare
+      1415,  // 98: sys_futex
+      5081,  // 99: sys_set_robust_list
+      1558,  // 100: sys_get_robust_list
+      3338,  // 101: sys_nanosleep
+      1754,  // 102: sys_getitimer
+      5285,  // 103: sys_setitimer
+      2453,  // 104: sys_kexec_load
+      2086,  // 105: sys_init_module
+      665,   // 106: sys_delete_module
+      6043,  // 107: sys_timer_create
+      6098,  // 108: sys_timer_gettime
+      6077,  // 109: sys_timer_getoverrun
+      6136,  // 110: sys_timer_settime
+      6060,  // 111: sys_timer_delete
+      520,   // 112: sys_clock_settime
+      435,   // 113: sys_clock_gettime
+      394,   // 114: sys_clock_getres
+      473,   // 115: sys_clock_nanosleep
+      6004,  // 116: sys_syslog
+      3998,  // 117: sys_ptrace
+      4799,  // 118: sys_sched_setparam
+      4818,  // 119: sys_sched_setscheduler
+      4677,  // 120: sys_sched_getscheduler
+      4658,  // 121: sys_sched_getparam
+      4759,  // 122: sys_sched_setaffinity
+      4618,  // 123: sys_sched_getaffinity
+      4841,  // 124: sys_sched_yield
+      4564,  // 125: sys_sched_get_priority_max
+      4591,  // 126: sys_sched_get_priority_min
+      4700,  // 127: sys_sched_rr_get_interval
+      4347,  // 128: sys_restart_syscall
+      2479,  // 129: sys_kill
+      6287,  // 130: sys_tkill
+      6023,  // 131: sys_tgkill
+      5629,  // 132: sys_sigaltstack
+      4477,  // 133: sys_rt_sigsuspend
+      4386,  // 134: sys_rt_sigaction
+      4421,  // 135: sys_rt_sigprocmask
+      4403,  // 136: sys_rt_sigpending
+      4495,  // 137: sys_rt_sigtimedwait
+      4440,  // 138: sys_rt_sigqueueinfo
+      4460,  // 139: sys_rt_sigreturn
+      5321,  // 140: sys_setpriority
+      1843,  // 141: sys_getpriority
+      4178,  // 142: sys_reboot
+      5337,  // 143: sys_setregid
+      5215,  // 144: sys_setgid
+      5425,  // 145: sys_setreuid
+      5510,  // 146: sys_setuid
+      5395,  // 147: sys_setresuid
+      1903,  // 148: sys_getresuid
+      5365,  // 149: sys_setresgid
+      1873,  // 150: sys_getresgid
+      5187,  // 151: sys_setfsuid
+      5159,  // 152: sys_setfsgid
+      6277,  // 153: sys_times
+      5309,  // 154: sys_setpgid
+      1784,  // 155: sys_getpgid
+      1961,  // 156: sys_getsid
+      5467,  // 157: sys_setsid
+      1724,  // 158: sys_getgroups
+      5239,  // 159: sys_setgroups
+      6396,  // 160: sys_uname
+      5269,  // 161: sys_sethostname
+      5141,  // 162: sys_setdomainname
+      1933,  // 163: sys_getrlimit
+      5453,  // 164: sys_setrlimit
+      1947,  // 165: sys_getrusage
+      6363,  // 166: sys_umask
+      3802,  // 167: sys_prctl
+      1598,  // 168: sys_getcpu
+      2014,  // 169: sys_gettimeofday
+      5493,  // 170: sys_settimeofday
       95,    // 171: sys_adjtimex
-      1482,  // 172: sys_getpid
-      1505,  // 173: sys_getppid
-      1705,  // 174: sys_getuid
-      1348,  // 175: sys_geteuid
-      1374,  // 176: sys_getgid
-      1322,  // 177: sys_getegid
-      1677,  // 178: sys_gettid
-      5100,  // 179: sys_sysinfo
-      2540,  // 180: sys_mq_open
-      2589,  // 181: sys_mq_unlink
-      2572,  // 182: sys_mq_timedsend
-      2552,  // 183: sys_mq_timedreceive
-      2526,  // 184: sys_mq_notify
-      2508,  // 185: sys_mq_getsetattr
-      2625,  // 186: sys_msgget
-      2614,  // 187: sys_msgctl
-      2636,  // 188: sys_msgrcv
-      2647,  // 189: sys_msgsnd
-      4041,  // 190: sys_semget
-      4030,  // 191: sys_semctl
-      4062,  // 192: sys_semtimedop
-      4052,  // 193: sys_semop
-      4678,  // 194: sys_shmget
-      4657,  // 195: sys_shmctl
-      4647,  // 196: sys_shmat
-      4668,  // 197: sys_shmdt
-      4830,  // 198: sys_socket
-      4856,  // 199: sys_socketpair
+      1808,  // 172: sys_getpid
+      1831,  // 173: sys_getppid
+      2031,  // 174: sys_getuid
+      1674,  // 175: sys_geteuid
+      1700,  // 176: sys_getgid
+      1648,  // 177: sys_getegid
+      2003,  // 178: sys_gettid
+      5992,  // 179: sys_sysinfo
+      3099,  // 180: sys_mq_open
+      3199,  // 181: sys_mq_unlink
+      3158,  // 182: sys_mq_timedsend
+      3111,  // 183: sys_mq_timedreceive
+      3085,  // 184: sys_mq_notify
+      3067,  // 185: sys_mq_getsetattr
+      3235,  // 186: sys_msgget
+      3224,  // 187: sys_msgctl
+      3246,  // 188: sys_msgrcv
+      3257,  // 189: sys_msgsnd
+      4904,  // 190: sys_semget
+      4893,  // 191: sys_semctl
+      4925,  // 192: sys_semtimedop
+      4915,  // 193: sys_semop
+      5591,  // 194: sys_shmget
+      5570,  // 195: sys_shmctl
+      5560,  // 196: sys_shmat
+      5581,  // 197: sys_shmdt
+      5743,  // 198: sys_socket
+      5769,  // 199: sys_socketpair
       232,   // 200: sys_bind
-      2135,  // 201: sys_listen
+      2623,  // 201: sys_listen
       40,    // 202: sys_accept
-      453,   // 203: sys_connect
-      1646,  // 204: sys_getsockname
-      1442,  // 205: sys_getpeername
-      4139,  // 206: sys_sendto
-      3415,  // 207: sys_recvfrom
-      4565,  // 208: sys_setsockopt
-      1662,  // 209: sys_getsockopt
-      4689,  // 210: sys_shutdown
-      4127,  // 211: sys_sendmsg
-      3441,  // 212: sys_recvmsg
-      3331,  // 213: sys_readahead
+      605,   // 203: sys_connect
+      1972,  // 204: sys_getsockname
+      1768,  // 205: sys_getpeername
+      5024,  // 206: sys_sendto
+      4198,  // 207: sys_recvfrom
+      5478,  // 208: sys_setsockopt
+      1988,  // 209: sys_getsockopt
+      5602,  // 210: sys_shutdown
+      5012,  // 211: sys_sendmsg
+      4244,  // 212: sys_recvmsg
+      4114,  // 213: sys_readahead
       259,   // 214: sys_brk
-      2695,  // 215: sys_munmap
-      2603,  // 216: sys_mremap
+      3305,  // 215: sys_munmap
+      3213,  // 216: sys_mremap
       83,    // 217: sys_add_key
-      3528,  // 218: sys_request_key
-      2057,  // 219: sys_keyctl
-      433,   // 220: sys_clone
-      699,   // 221: sys_execve
-      2428,  // 222: sys_mmap
-      761,   // 223: sys_fadvise64
-      4980,  // 224: sys_swapon
-      4968,  // 225: sys_swapoff
-      2487,  // 226: sys_mprotect
-      2658,  // 227: sys_msync
-      2394,  // 228: sys_mlock
-      2668,  // 229: sys_munlock
-      2415,  // 230: sys_mlockall
-      2680,  // 231: sys_munlockall
-      2338,  // 232: sys_mincore
-      2266,  // 233: sys_madvise
-      3453,  // 234: sys_remap_file_pages
-      2278,  // 235: sys_mbind
-      1214,  // 236: sys_get_mempolicy
-      4150,  // 237: sys_set_mempolicy
-      2320,  // 238: sys_migrate_pages
-      2472,  // 239: sys_move_pages
-      3712,  // 240: sys_rt_tgsigqueueinfo
-      2960,  // 241: sys_perf_event_open
+      4331,  // 218: sys_request_key
+      2468,  // 219: sys_keyctl
+      558,   // 220: sys_clone
+      868,   // 221: sys_execve
+      2954,  // 222: sys_mmap
+      945,   // 223: sys_fadvise64
+      5893,  // 224: sys_swapon
+      5881,  // 225: sys_swapoff
+      3046,  // 226: sys_mprotect
+      3268,  // 227: sys_msync
+      2920,  // 228: sys_mlock
+      3278,  // 229: sys_munlock
+      2941,  // 230: sys_mlockall
+      3290,  // 231: sys_munlockall
+      2864,  // 232: sys_mincore
+      2754,  // 233: sys_madvise
+      4256,  // 234: sys_remap_file_pages
+      2787,  // 235: sys_mbind
+      1540,  // 236: sys_get_mempolicy
+      5035,  // 237: sys_set_mempolicy
+      2846,  // 238: sys_migrate_pages
+      3031,  // 239: sys_move_pages
+      4542,  // 240: sys_rt_tgsigqueueinfo
+      3596,  // 241: sys_perf_event_open
       51,    // 242: sys_accept4
-      3428,  // 243: sys_recvmmsg
+      4211,  // 243: sys_recvmmsg
       149,   // 244: sys_arch_specific_syscall
       0,     // 245:
       0,     // 246:
@@ -1092,1180 +739,1470 @@
       0,     // 257:
       0,     // 258:
       0,     // 259:
-      5606,  // 260: sys_wait4
-      3141,  // 261: sys_prlimit64
-      806,   // 262: sys_fanotify_init
-      824,   // 263: sys_fanotify_mark
-      2706,  // 264: sys_name_to_handle_at
-      2857,  // 265: sys_open_by_handle_at
-      342,   // 266: sys_clock_adjtime
-      5067,  // 267: sys_syncfs
-      4386,  // 268: sys_setns
-      4114,  // 269: sys_sendmmsg
-      3155,  // 270: sys_process_vm_readv
-      3176,  // 271: sys_process_vm_writev
-      2013,  // 272: sys_kcmp
-      964,   // 273: sys_finit_module
-      3918,  // 274: sys_sched_setattr
-      3810,  // 275: sys_sched_getattr
-      3514,  // 276: sys_renameat2
-      3994,  // 277: sys_seccomp
-      1533,  // 278: sys_getrandom
-      2303,  // 279: sys_memfd_create
+      6603,  // 260: sys_wait4
+      3847,  // 261: sys_prlimit64
+      990,   // 262: sys_fanotify_init
+      1008,  // 263: sys_fanotify_mark
+      3316,  // 264: sys_name_to_handle_at
+      3467,  // 265: sys_open_by_handle_at
+      356,   // 266: sys_clock_adjtime
+      5959,  // 267: sys_syncfs
+      5299,  // 268: sys_setns
+      4999,  // 269: sys_sendmmsg
+      3902,  // 270: sys_process_vm_readv
+      3923,  // 271: sys_process_vm_writev
+      2424,  // 272: sys_kcmp
+      1162,  // 273: sys_finit_module
+      4781,  // 274: sys_sched_setattr
+      4640,  // 275: sys_sched_getattr
+      4317,  // 276: sys_renameat2
+      4857,  // 277: sys_seccomp
+      1859,  // 278: sys_getrandom
+      2812,  // 279: sys_memfd_create
       241,   // 280: sys_bpf
-      710,   // 281: sys_execveat
-      5477,  // 282: sys_userfaultfd
-      2288,  // 283: sys_membarrier
-      2404,  // 284: sys_mlock2
-      465,   // 285: sys_copy_file_range
-      3129,  // 286: sys_preadv2
-      3279,  // 287: sys_pwritev2
-      3059,  // 288: sys_pkey_mprotect
-      3030,  // 289: sys_pkey_alloc
-      3045,  // 290: sys_pkey_free
-      4939,  // 291: sys_statx
-      1900,  // 292: sys_io_pgetevents
-      3574,  // 293: sys_rseq
+      879,   // 281: sys_execveat
+      6453,  // 282: sys_userfaultfd
+      2797,  // 283: sys_membarrier
+      2930,  // 284: sys_mlock2
+      617,   // 285: sys_copy_file_range
+      3835,  // 286: sys_preadv2
+      4046,  // 287: sys_pwritev2
+      3748,  // 288: sys_pkey_mprotect
+      3719,  // 289: sys_pkey_alloc
+      3734,  // 290: sys_pkey_free
+      5852,  // 291: sys_statx
+      2226,  // 292: sys_io_pgetevents
+      4377,  // 293: sys_rseq
+      2433,  // 294: sys_kexec_file_load
+      0,     // 295:
+      0,     // 296:
+      0,     // 297:
+      0,     // 298:
+      0,     // 299:
+      0,     // 300:
+      0,     // 301:
+      0,     // 302:
+      0,     // 303:
+      0,     // 304:
+      0,     // 305:
+      0,     // 306:
+      0,     // 307:
+      0,     // 308:
+      0,     // 309:
+      0,     // 310:
+      0,     // 311:
+      0,     // 312:
+      0,     // 313:
+      0,     // 314:
+      0,     // 315:
+      0,     // 316:
+      0,     // 317:
+      0,     // 318:
+      0,     // 319:
+      0,     // 320:
+      0,     // 321:
+      0,     // 322:
+      0,     // 323:
+      0,     // 324:
+      0,     // 325:
+      0,     // 326:
+      0,     // 327:
+      0,     // 328:
+      0,     // 329:
+      0,     // 330:
+      0,     // 331:
+      0,     // 332:
+      0,     // 333:
+      0,     // 334:
+      0,     // 335:
+      0,     // 336:
+      0,     // 337:
+      0,     // 338:
+      0,     // 339:
+      0,     // 340:
+      0,     // 341:
+      0,     // 342:
+      0,     // 343:
+      0,     // 344:
+      0,     // 345:
+      0,     // 346:
+      0,     // 347:
+      0,     // 348:
+      0,     // 349:
+      0,     // 350:
+      0,     // 351:
+      0,     // 352:
+      0,     // 353:
+      0,     // 354:
+      0,     // 355:
+      0,     // 356:
+      0,     // 357:
+      0,     // 358:
+      0,     // 359:
+      0,     // 360:
+      0,     // 361:
+      0,     // 362:
+      0,     // 363:
+      0,     // 364:
+      0,     // 365:
+      0,     // 366:
+      0,     // 367:
+      0,     // 368:
+      0,     // 369:
+      0,     // 370:
+      0,     // 371:
+      0,     // 372:
+      0,     // 373:
+      0,     // 374:
+      0,     // 375:
+      0,     // 376:
+      0,     // 377:
+      0,     // 378:
+      0,     // 379:
+      0,     // 380:
+      0,     // 381:
+      0,     // 382:
+      0,     // 383:
+      0,     // 384:
+      0,     // 385:
+      0,     // 386:
+      0,     // 387:
+      0,     // 388:
+      0,     // 389:
+      0,     // 390:
+      0,     // 391:
+      0,     // 392:
+      0,     // 393:
+      0,     // 394:
+      0,     // 395:
+      0,     // 396:
+      0,     // 397:
+      0,     // 398:
+      0,     // 399:
+      0,     // 400:
+      0,     // 401:
+      0,     // 402:
+      453,   // 403: sys_clock_gettime64
+      538,   // 404: sys_clock_settime64
+      374,   // 405: sys_clock_adjtime64
+      411,   // 406: sys_clock_getres_time64
+      493,   // 407: sys_clock_nanosleep_time64
+      6116,  // 408: sys_timer_gettime64
+      6154,  // 409: sys_timer_settime64
+      6213,  // 410: sys_timerfd_gettime64
+      6255,  // 411: sys_timerfd_settime64
+      6503,  // 412: sys_utimensat_time64
+      3978,  // 413: sys_pselect6_time64
+      3785,  // 414: sys_ppoll_time64
+      0,     // 415:
+      2244,  // 416: sys_io_pgetevents_time64
+      4224,  // 417: sys_recvmmsg_time64
+      3175,  // 418: sys_mq_timedsend_time64
+      3131,  // 419: sys_mq_timedreceive_time64
+      4940,  // 420: sys_semtimedop_time64
+      4515,  // 421: sys_rt_sigtimedwait_time64
+      1443,  // 422: sys_futex_time64
+      4726,  // 423: sys_sched_rr_get_interval_time64
+      3663,  // 424: sys_pidfd_send_signal
+      2337,  // 425: sys_io_uring_setup
+      2296,  // 426: sys_io_uring_enter
+      2315,  // 427: sys_io_uring_register
+      3489,  // 428: sys_open_tree
+      3016,  // 429: sys_move_mount
+      1269,  // 430: sys_fsopen
+      1230,  // 431: sys_fsconfig
+      1257,  // 432: sys_fsmount
+      1280,  // 433: sys_fspick
+      3648,  // 434: sys_pidfd_open
+      568,   // 435: sys_clone3
+      589,   // 436: sys_close_range
+      3514,  // 437: sys_openat2
+      3632,  // 438: sys_pidfd_getfd
+      930,   // 439: sys_faccessat2
+      3861,  // 440: sys_process_madvise
+      792,   // 441: sys_epoll_pwait2
+      2998,  // 442: sys_mount_setattr
+      4089,  // 443: sys_quotactl_fd
+      2510,  // 444: sys_landlock_create_ruleset
+      2488,  // 445: sys_landlock_add_rule
+      2538,  // 446: sys_landlock_restrict_self
+      2829,  // 447: sys_memfd_secret
+      3881,  // 448: sys_process_mrelease
+      1475,  // 449: sys_futex_waitv
+      5053,  // 450: sys_set_mempolicy_home_node
+      267,   // 451: sys_cachestat
+      1061,  // 452: sys_fchmodat2
+      2766,  // 453: sys_map_shadow_stack
+      1491,  // 454: sys_futex_wake
+      1460,  // 455: sys_futex_wait
+      1425,  // 456: sys_futex_requeue
   };
 };
 
-struct SyscallTable_armeabi {
+struct SyscallTable_arm32 {
   static constexpr const char* names = kAllSyscalllNames;
   static constexpr SyscallTable::OffT offsets[]{
-      3544,  // 0: sys_restart_syscall
-      723,   // 1: sys_exit
-      1006,  // 2: sys_fork
-      3322,  // 3: sys_read
-      5639,  // 4: sys_write
-      2848,  // 5: sys_open
-      443,   // 6: sys_close
+      4347,  // 0: sys_restart_syscall
+      892,   // 1: sys_exit
+      1204,  // 2: sys_fork
+      4105,  // 3: sys_read
+      6636,  // 4: sys_write
+      3458,  // 5: sys_open
+      579,   // 6: sys_close
       0,     // 7:
-      485,   // 8: sys_creat
-      2115,  // 9: sys_link
-      5430,  // 10: sys_unlink
-      699,   // 11: sys_execve
-      289,   // 12: sys_chdir
-      5142,  // 13: sys_time
-      2372,  // 14: sys_mknod
-      299,   // 15: sys_chmod
-      2077,  // 16: sys_lchown
+      637,   // 8: sys_creat
+      2603,  // 9: sys_link
+      6406,  // 10: sys_unlink
+      868,   // 11: sys_execve
+      303,   // 12: sys_chdir
+      6034,  // 13: sys_time
+      2898,  // 14: sys_mknod
+      313,   // 15: sys_chmod
+      2565,  // 16: sys_lchown
       0,     // 17:
       0,     // 18:
-      2220,  // 19: sys_lseek
-      1482,  // 20: sys_getpid
-      2462,  // 21: sys_mount
-      5397,  // 22: sys_umount
-      4597,  // 23: sys_setuid
-      1705,  // 24: sys_getuid
-      4949,  // 25: sys_stime
-      3231,  // 26: sys_ptrace
+      2708,  // 19: sys_lseek
+      1808,  // 20: sys_getpid
+      2988,  // 21: sys_mount
+      6373,  // 22: sys_umount
+      5510,  // 23: sys_setuid
+      2031,  // 24: sys_getuid
+      5862,  // 25: sys_stime
+      3998,  // 26: sys_ptrace
       124,   // 27: sys_alarm
       0,     // 28:
-      2890,  // 29: sys_pause
-      5503,  // 30: sys_utime
+      3526,  // 29: sys_pause
+      6479,  // 30: sys_utime
       0,     // 31:
       0,     // 32:
       63,    // 33: sys_access
-      2772,  // 34: sys_nice
+      3382,  // 34: sys_nice
       0,     // 35:
-      5017,  // 36: sys_sync
-      2068,  // 37: sys_kill
-      3490,  // 38: sys_rename
-      2350,  // 39: sys_mkdir
-      3564,  // 40: sys_rmdir
-      531,   // 41: sys_dup
-      2996,  // 42: sys_pipe
-      5301,  // 43: sys_times
+      5930,  // 36: sys_sync
+      2479,  // 37: sys_kill
+      4293,  // 38: sys_rename
+      2876,  // 39: sys_mkdir
+      4367,  // 40: sys_rmdir
+      683,   // 41: sys_dup
+      3685,  // 42: sys_pipe
+      6277,  // 43: sys_times
       0,     // 44:
       259,   // 45: sys_brk
-      4302,  // 46: sys_setgid
-      1374,  // 47: sys_getgid
+      5215,  // 46: sys_setgid
+      1700,  // 47: sys_getgid
       0,     // 48:
-      1348,  // 49: sys_geteuid
-      1322,  // 50: sys_getegid
+      1674,  // 49: sys_geteuid
+      1648,  // 50: sys_getegid
       74,    // 51: sys_acct
-      5408,  // 52: sys_umount2
+      6384,  // 52: sys_umount2
       0,     // 53:
-      1945,  // 54: sys_ioctl
-      914,   // 55: sys_fcntl
+      2356,  // 54: sys_ioctl
+      1112,  // 55: sys_fcntl
       0,     // 56:
-      4396,  // 57: sys_setpgid
+      5309,  // 57: sys_setpgid
       0,     // 58:
       0,     // 59:
-      5387,  // 60: sys_umask
-      331,   // 61: sys_chroot
-      5493,  // 62: sys_ustat
-      539,   // 63: sys_dup2
-      1505,  // 64: sys_getppid
-      1470,  // 65: sys_getpgrp
-      4554,  // 66: sys_setsid
-      4702,  // 67: sys_sigaction
+      6363,  // 60: sys_umask
+      345,   // 61: sys_chroot
+      6469,  // 62: sys_ustat
+      691,   // 63: sys_dup2
+      1831,  // 64: sys_getppid
+      1796,  // 65: sys_getpgrp
+      5467,  // 66: sys_setsid
+      5615,  // 67: sys_sigaction
       0,     // 68:
       0,     // 69:
-      4512,  // 70: sys_setreuid
-      4424,  // 71: sys_setregid
-      4815,  // 72: sys_sigsuspend
-      4770,  // 73: sys_sigpending
-      4356,  // 74: sys_sethostname
-      4540,  // 75: sys_setrlimit
-      1607,  // 76: sys_getrlimit
-      1621,  // 77: sys_getrusage
-      1688,  // 78: sys_gettimeofday
-      4580,  // 79: sys_settimeofday
-      1398,  // 80: sys_getgroups
-      4326,  // 81: sys_setgroups
-      4019,  // 82: sys_select
-      4991,  // 83: sys_symlink
+      5425,  // 70: sys_setreuid
+      5337,  // 71: sys_setregid
+      5728,  // 72: sys_sigsuspend
+      5683,  // 73: sys_sigpending
+      5269,  // 74: sys_sethostname
+      5453,  // 75: sys_setrlimit
+      1933,  // 76: sys_getrlimit
+      1947,  // 77: sys_getrusage
+      2014,  // 78: sys_gettimeofday
+      5493,  // 79: sys_settimeofday
+      1724,  // 80: sys_getgroups
+      5239,  // 81: sys_setgroups
+      4882,  // 82: sys_select
+      5904,  // 83: sys_symlink
       0,     // 84:
-      3357,  // 85: sys_readlink
-      5466,  // 86: sys_uselib
-      4980,  // 87: sys_swapon
-      3395,  // 88: sys_reboot
-      3345,  // 89: sys_readdir
-      2428,  // 90: sys_mmap
-      2695,  // 91: sys_munmap
-      5321,  // 92: sys_truncate
-      1140,  // 93: sys_ftruncate
-      853,   // 94: sys_fchmod
-      877,   // 95: sys_fchown
-      1517,  // 96: sys_getpriority
-      4408,  // 97: sys_setpriority
+      4140,  // 85: sys_readlink
+      6442,  // 86: sys_uselib
+      5893,  // 87: sys_swapon
+      4178,  // 88: sys_reboot
+      4128,  // 89: sys_readdir
+      2954,  // 90: sys_mmap
+      3305,  // 91: sys_munmap
+      6297,  // 92: sys_truncate
+      1385,  // 93: sys_ftruncate
+      1037,  // 94: sys_fchmod
+      1075,  // 95: sys_fchown
+      1843,  // 96: sys_getpriority
+      5321,  // 97: sys_setpriority
       0,     // 98:
-      4915,  // 99: sys_statfs
-      1094,  // 100: sys_fstatfs
+      5828,  // 99: sys_statfs
+      1339,  // 100: sys_fstatfs
       0,     // 101:
-      4841,  // 102: sys_socketcall
-      5112,  // 103: sys_syslog
-      4372,  // 104: sys_setitimer
-      1428,  // 105: sys_getitimer
-      4895,  // 106: sys_stat
-      2244,  // 107: sys_lstat
-      1046,  // 108: sys_fstat
+      5754,  // 102: sys_socketcall
+      6004,  // 103: sys_syslog
+      5285,  // 104: sys_setitimer
+      1754,  // 105: sys_getitimer
+      5808,  // 106: sys_stat
+      2732,  // 107: sys_lstat
+      1291,  // 108: sys_fstat
       0,     // 109:
       0,     // 110:
-      5548,  // 111: sys_vhangup
+      6545,  // 111: sys_vhangup
       0,     // 112:
-      5078,  // 113: sys_syscall
-      5606,  // 114: sys_wait4
-      4968,  // 115: sys_swapoff
-      5100,  // 116: sys_sysinfo
-      2005,  // 117: sys_ipc
-      1120,  // 118: sys_fsync
-      4801,  // 119: sys_sigreturn
-      433,   // 120: sys_clone
-      4228,  // 121: sys_setdomainname
-      5420,  // 122: sys_uname
+      5970,  // 113: sys_syscall
+      6603,  // 114: sys_wait4
+      5881,  // 115: sys_swapoff
+      5992,  // 116: sys_sysinfo
+      2416,  // 117: sys_ipc
+      1365,  // 118: sys_fsync
+      5714,  // 119: sys_sigreturn
+      558,   // 120: sys_clone
+      5141,  // 121: sys_setdomainname
+      6396,  // 122: sys_uname
       0,     // 123:
       95,    // 124: sys_adjtimex
-      2487,  // 125: sys_mprotect
-      4785,  // 126: sys_sigprocmask
+      3046,  // 125: sys_mprotect
+      5698,  // 126: sys_sigprocmask
       0,     // 127:
-      1760,  // 128: sys_init_module
-      513,   // 129: sys_delete_module
+      2086,  // 128: sys_init_module
+      665,   // 129: sys_delete_module
       0,     // 130:
-      3309,  // 131: sys_quotactl
-      1458,  // 132: sys_getpgid
-      842,   // 133: sys_fchdir
+      4076,  // 131: sys_quotactl
+      1784,  // 132: sys_getpgid
+      1026,  // 133: sys_fchdir
       220,   // 134: sys_bdflush
-      5090,  // 135: sys_sysfs
-      2980,  // 136: sys_personality
+      5982,  // 135: sys_sysfs
+      3616,  // 136: sys_personality
       0,     // 137:
-      4274,  // 138: sys_setfsuid
-      4246,  // 139: sys_setfsgid
+      5187,  // 138: sys_setfsuid
+      5159,  // 139: sys_setfsgid
       1,     // 140: sys__llseek
-      1294,  // 141: sys_getdents
+      1620,  // 141: sys_getdents
       13,    // 142: sys__newselect
-      996,   // 143: sys_flock
-      2658,  // 144: sys_msync
-      3385,  // 145: sys_readv
-      5649,  // 146: sys_writev
-      1635,  // 147: sys_getsid
-      936,   // 148: sys_fdatasync
+      1194,  // 143: sys_flock
+      3268,  // 144: sys_msync
+      4168,  // 145: sys_readv
+      6646,  // 146: sys_writev
+      1961,  // 147: sys_getsid
+      1134,  // 148: sys_fdatasync
       28,    // 149: sys__sysctl
-      2394,  // 150: sys_mlock
-      2668,  // 151: sys_munlock
-      2415,  // 152: sys_mlockall
-      2680,  // 153: sys_munlockall
-      3936,  // 154: sys_sched_setparam
-      3828,  // 155: sys_sched_getparam
-      3955,  // 156: sys_sched_setscheduler
-      3847,  // 157: sys_sched_getscheduler
-      3978,  // 158: sys_sched_yield
-      3734,  // 159: sys_sched_get_priority_max
-      3761,  // 160: sys_sched_get_priority_min
-      3870,  // 161: sys_sched_rr_get_interval
-      2728,  // 162: sys_nanosleep
-      2603,  // 163: sys_mremap
-      4482,  // 164: sys_setresuid
-      1577,  // 165: sys_getresuid
+      2920,  // 150: sys_mlock
+      3278,  // 151: sys_munlock
+      2941,  // 152: sys_mlockall
+      3290,  // 153: sys_munlockall
+      4799,  // 154: sys_sched_setparam
+      4658,  // 155: sys_sched_getparam
+      4818,  // 156: sys_sched_setscheduler
+      4677,  // 157: sys_sched_getscheduler
+      4841,  // 158: sys_sched_yield
+      4564,  // 159: sys_sched_get_priority_max
+      4591,  // 160: sys_sched_get_priority_min
+      4700,  // 161: sys_sched_rr_get_interval
+      3338,  // 162: sys_nanosleep
+      3213,  // 163: sys_mremap
+      5395,  // 164: sys_setresuid
+      1903,  // 165: sys_getresuid
       0,     // 166:
       0,     // 167:
-      3077,  // 168: sys_poll
-      2757,  // 169: sys_nfsservctl
-      4452,  // 170: sys_setresgid
-      1547,  // 171: sys_getresgid
-      3096,  // 172: sys_prctl
-      3657,  // 173: sys_rt_sigreturn
-      3583,  // 174: sys_rt_sigaction
-      3618,  // 175: sys_rt_sigprocmask
-      3600,  // 176: sys_rt_sigpending
-      3692,  // 177: sys_rt_sigtimedwait
-      3637,  // 178: sys_rt_sigqueueinfo
-      3674,  // 179: sys_rt_sigsuspend
-      3106,  // 180: sys_pread64
-      3254,  // 181: sys_pwrite64
-      309,   // 182: sys_chown
-      1283,  // 183: sys_getcwd
-      267,   // 184: sys_capget
-      278,   // 185: sys_capset
-      4716,  // 186: sys_sigaltstack
-      4086,  // 187: sys_sendfile
+      3766,  // 168: sys_poll
+      3367,  // 169: sys_nfsservctl
+      5365,  // 170: sys_setresgid
+      1873,  // 171: sys_getresgid
+      3802,  // 172: sys_prctl
+      4460,  // 173: sys_rt_sigreturn
+      4386,  // 174: sys_rt_sigaction
+      4421,  // 175: sys_rt_sigprocmask
+      4403,  // 176: sys_rt_sigpending
+      4495,  // 177: sys_rt_sigtimedwait
+      4440,  // 178: sys_rt_sigqueueinfo
+      4477,  // 179: sys_rt_sigsuspend
+      3812,  // 180: sys_pread64
+      4021,  // 181: sys_pwrite64
+      323,   // 182: sys_chown
+      1609,  // 183: sys_getcwd
+      281,   // 184: sys_capget
+      292,   // 185: sys_capset
+      5629,  // 186: sys_sigaltstack
+      4971,  // 187: sys_sendfile
       0,     // 188:
       0,     // 189:
-      5538,  // 190: sys_vfork
-      5361,  // 191: sys_ugetrlimit
-      2437,  // 192: sys_mmap2
-      5334,  // 193: sys_truncate64
-      1154,  // 194: sys_ftruncate64
-      4904,  // 195: sys_stat64
-      2254,  // 196: sys_lstat64
-      1056,  // 197: sys_fstat64
-      2088,  // 198: sys_lchown32
-      1716,  // 199: sys_getuid32
-      1385,  // 200: sys_getgid32
-      1360,  // 201: sys_geteuid32
-      1334,  // 202: sys_getegid32
-      4525,  // 203: sys_setreuid32
-      4437,  // 204: sys_setregid32
-      1412,  // 205: sys_getgroups32
-      4340,  // 206: sys_setgroups32
-      888,   // 207: sys_fchown32
-      4496,  // 208: sys_setresuid32
-      1591,  // 209: sys_getresuid32
-      4466,  // 210: sys_setresgid32
-      1561,  // 211: sys_getresgid32
-      319,   // 212: sys_chown32
-      4608,  // 213: sys_setuid32
-      4313,  // 214: sys_setgid32
-      4287,  // 215: sys_setfsuid32
-      4259,  // 216: sys_setfsgid32
-      1307,  // 217: sys_getdents64
-      3015,  // 218: sys_pivot_root
-      2338,  // 219: sys_mincore
-      2266,  // 220: sys_madvise
-      924,   // 221: sys_fcntl64
+      6535,  // 190: sys_vfork
+      6337,  // 191: sys_ugetrlimit
+      2963,  // 192: sys_mmap2
+      6310,  // 193: sys_truncate64
+      1399,  // 194: sys_ftruncate64
+      5817,  // 195: sys_stat64
+      2742,  // 196: sys_lstat64
+      1301,  // 197: sys_fstat64
+      2576,  // 198: sys_lchown32
+      2042,  // 199: sys_getuid32
+      1711,  // 200: sys_getgid32
+      1686,  // 201: sys_geteuid32
+      1660,  // 202: sys_getegid32
+      5438,  // 203: sys_setreuid32
+      5350,  // 204: sys_setregid32
+      1738,  // 205: sys_getgroups32
+      5253,  // 206: sys_setgroups32
+      1086,  // 207: sys_fchown32
+      5409,  // 208: sys_setresuid32
+      1917,  // 209: sys_getresuid32
+      5379,  // 210: sys_setresgid32
+      1887,  // 211: sys_getresgid32
+      333,   // 212: sys_chown32
+      5521,  // 213: sys_setuid32
+      5226,  // 214: sys_setgid32
+      5200,  // 215: sys_setfsuid32
+      5172,  // 216: sys_setfsgid32
+      1633,  // 217: sys_getdents64
+      3704,  // 218: sys_pivot_root
+      2864,  // 219: sys_mincore
+      2754,  // 220: sys_madvise
+      1122,  // 221: sys_fcntl64
       0,     // 222:
       0,     // 223:
-      1677,  // 224: sys_gettid
-      3331,  // 225: sys_readahead
-      4621,  // 226: sys_setxattr
-      2230,  // 227: sys_lsetxattr
-      1032,  // 228: sys_fsetxattr
-      1729,  // 229: sys_getxattr
-      2101,  // 230: sys_lgetxattr
-      950,   // 231: sys_fgetxattr
-      2146,  // 232: sys_listxattr
-      2160,  // 233: sys_llistxattr
-      981,   // 234: sys_flistxattr
-      3474,  // 235: sys_removexattr
-      2203,  // 236: sys_lremovexattr
-      1015,  // 237: sys_fremovexattr
-      5311,  // 238: sys_tkill
-      4099,  // 239: sys_sendfile64
-      1170,  // 240: sys_futex
-      3896,  // 241: sys_sched_setaffinity
-      3788,  // 242: sys_sched_getaffinity
-      1918,  // 243: sys_io_setup
-      1868,  // 244: sys_io_destroy
-      1883,  // 245: sys_io_getevents
-      1931,  // 246: sys_io_submit
-      1854,  // 247: sys_io_cancel
-      732,   // 248: sys_exit_group
-      2184,  // 249: sys_lookup_dcookie
-      557,   // 250: sys_epoll_create
-      592,   // 251: sys_epoll_ctl
-      640,   // 252: sys_epoll_wait
-      3453,  // 253: sys_remap_file_pages
+      2003,  // 224: sys_gettid
+      4114,  // 225: sys_readahead
+      5534,  // 226: sys_setxattr
+      2718,  // 227: sys_lsetxattr
+      1243,  // 228: sys_fsetxattr
+      2055,  // 229: sys_getxattr
+      2589,  // 230: sys_lgetxattr
+      1148,  // 231: sys_fgetxattr
+      2634,  // 232: sys_listxattr
+      2648,  // 233: sys_llistxattr
+      1179,  // 234: sys_flistxattr
+      4277,  // 235: sys_removexattr
+      2691,  // 236: sys_lremovexattr
+      1213,  // 237: sys_fremovexattr
+      6287,  // 238: sys_tkill
+      4984,  // 239: sys_sendfile64
+      1415,  // 240: sys_futex
+      4759,  // 241: sys_sched_setaffinity
+      4618,  // 242: sys_sched_getaffinity
+      2269,  // 243: sys_io_setup
+      2194,  // 244: sys_io_destroy
+      2209,  // 245: sys_io_getevents
+      2282,  // 246: sys_io_submit
+      2180,  // 247: sys_io_cancel
+      901,   // 248: sys_exit_group
+      2672,  // 249: sys_lookup_dcookie
+      709,   // 250: sys_epoll_create
+      744,   // 251: sys_epoll_ctl
+      809,   // 252: sys_epoll_wait
+      4256,  // 253: sys_remap_file_pages
       0,     // 254:
       0,     // 255:
-      4208,  // 256: sys_set_tid_address
-      5151,  // 257: sys_timer_create
-      5224,  // 258: sys_timer_settime
-      5206,  // 259: sys_timer_gettime
-      5185,  // 260: sys_timer_getoverrun
-      5168,  // 261: sys_timer_delete
-      415,   // 262: sys_clock_settime
-      377,   // 263: sys_clock_gettime
-      360,   // 264: sys_clock_getres
-      395,   // 265: sys_clock_nanosleep
-      4926,  // 266: sys_statfs64
-      1106,  // 267: sys_fstatfs64
-      5131,  // 268: sys_tgkill
-      5527,  // 269: sys_utimes
+      5121,  // 256: sys_set_tid_address
+      6043,  // 257: sys_timer_create
+      6136,  // 258: sys_timer_settime
+      6098,  // 259: sys_timer_gettime
+      6077,  // 260: sys_timer_getoverrun
+      6060,  // 261: sys_timer_delete
+      520,   // 262: sys_clock_settime
+      435,   // 263: sys_clock_gettime
+      394,   // 264: sys_clock_getres
+      473,   // 265: sys_clock_nanosleep
+      5839,  // 266: sys_statfs64
+      1351,  // 267: sys_fstatfs64
+      6023,  // 268: sys_tgkill
+      6524,  // 269: sys_utimes
       175,   // 270: sys_arm_fadvise64_64
-      2900,  // 271: sys_pciconfig_iobase
-      2921,  // 272: sys_pciconfig_read
-      2940,  // 273: sys_pciconfig_write
-      2540,  // 274: sys_mq_open
-      2589,  // 275: sys_mq_unlink
-      2572,  // 276: sys_mq_timedsend
-      2552,  // 277: sys_mq_timedreceive
-      2526,  // 278: sys_mq_notify
-      2508,  // 279: sys_mq_getsetattr
-      5616,  // 280: sys_waitid
-      4830,  // 281: sys_socket
+      3536,  // 271: sys_pciconfig_iobase
+      3557,  // 272: sys_pciconfig_read
+      3576,  // 273: sys_pciconfig_write
+      3099,  // 274: sys_mq_open
+      3199,  // 275: sys_mq_unlink
+      3158,  // 276: sys_mq_timedsend
+      3111,  // 277: sys_mq_timedreceive
+      3085,  // 278: sys_mq_notify
+      3067,  // 279: sys_mq_getsetattr
+      6613,  // 280: sys_waitid
+      5743,  // 281: sys_socket
       232,   // 282: sys_bind
-      453,   // 283: sys_connect
-      2135,  // 284: sys_listen
+      605,   // 283: sys_connect
+      2623,  // 284: sys_listen
       40,    // 285: sys_accept
-      1646,  // 286: sys_getsockname
-      1442,  // 287: sys_getpeername
-      4856,  // 288: sys_socketpair
-      4077,  // 289: sys_send
-      4139,  // 290: sys_sendto
-      3406,  // 291: sys_recv
-      3415,  // 292: sys_recvfrom
-      4689,  // 293: sys_shutdown
-      4565,  // 294: sys_setsockopt
-      1662,  // 295: sys_getsockopt
-      4127,  // 296: sys_sendmsg
-      3441,  // 297: sys_recvmsg
-      4052,  // 298: sys_semop
-      4041,  // 299: sys_semget
-      4030,  // 300: sys_semctl
-      2647,  // 301: sys_msgsnd
-      2636,  // 302: sys_msgrcv
-      2625,  // 303: sys_msgget
-      2614,  // 304: sys_msgctl
-      4647,  // 305: sys_shmat
-      4668,  // 306: sys_shmdt
-      4678,  // 307: sys_shmget
-      4657,  // 308: sys_shmctl
+      1972,  // 286: sys_getsockname
+      1768,  // 287: sys_getpeername
+      5769,  // 288: sys_socketpair
+      4962,  // 289: sys_send
+      5024,  // 290: sys_sendto
+      4189,  // 291: sys_recv
+      4198,  // 292: sys_recvfrom
+      5602,  // 293: sys_shutdown
+      5478,  // 294: sys_setsockopt
+      1988,  // 295: sys_getsockopt
+      5012,  // 296: sys_sendmsg
+      4244,  // 297: sys_recvmsg
+      4915,  // 298: sys_semop
+      4904,  // 299: sys_semget
+      4893,  // 300: sys_semctl
+      3257,  // 301: sys_msgsnd
+      3246,  // 302: sys_msgrcv
+      3235,  // 303: sys_msgget
+      3224,  // 304: sys_msgctl
+      5560,  // 305: sys_shmat
+      5581,  // 306: sys_shmdt
+      5591,  // 307: sys_shmget
+      5570,  // 308: sys_shmctl
       83,    // 309: sys_add_key
-      3528,  // 310: sys_request_key
-      2057,  // 311: sys_keyctl
-      4062,  // 312: sys_semtimedop
-      5594,  // 313: sys_vserver
-      1990,  // 314: sys_ioprio_set
-      1975,  // 315: sys_ioprio_get
-      1798,  // 316: sys_inotify_init
-      1776,  // 317: sys_inotify_add_watch
-      1833,  // 318: sys_inotify_rm_watch
-      2278,  // 319: sys_mbind
-      1214,  // 320: sys_get_mempolicy
-      4150,  // 321: sys_set_mempolicy
-      2879,  // 322: sys_openat
-      2360,  // 323: sys_mkdirat
-      2382,  // 324: sys_mknodat
-      901,   // 325: sys_fchownat
-      1180,  // 326: sys_futimesat
-      1080,  // 327: sys_fstatat64
-      5441,  // 328: sys_unlinkat
-      3501,  // 329: sys_renameat
-      2124,  // 330: sys_linkat
-      5003,  // 331: sys_symlinkat
-      3370,  // 332: sys_readlinkat
-      864,   // 333: sys_fchmodat
-      747,   // 334: sys_faccessat
-      3218,  // 335: sys_pselect6
-      3086,  // 336: sys_ppoll
-      5454,  // 337: sys_unshare
-      4168,  // 338: sys_set_robust_list
-      1232,  // 339: sys_get_robust_list
-      4871,  // 340: sys_splice
+      4331,  // 310: sys_request_key
+      2468,  // 311: sys_keyctl
+      4925,  // 312: sys_semtimedop
+      6591,  // 313: sys_vserver
+      2401,  // 314: sys_ioprio_set
+      2386,  // 315: sys_ioprio_get
+      2124,  // 316: sys_inotify_init
+      2102,  // 317: sys_inotify_add_watch
+      2159,  // 318: sys_inotify_rm_watch
+      2787,  // 319: sys_mbind
+      1540,  // 320: sys_get_mempolicy
+      5035,  // 321: sys_set_mempolicy
+      3503,  // 322: sys_openat
+      2886,  // 323: sys_mkdirat
+      2908,  // 324: sys_mknodat
+      1099,  // 325: sys_fchownat
+      1506,  // 326: sys_futimesat
+      1325,  // 327: sys_fstatat64
+      6417,  // 328: sys_unlinkat
+      4304,  // 329: sys_renameat
+      2612,  // 330: sys_linkat
+      5916,  // 331: sys_symlinkat
+      4153,  // 332: sys_readlinkat
+      1048,  // 333: sys_fchmodat
+      916,   // 334: sys_faccessat
+      3965,  // 335: sys_pselect6
+      3775,  // 336: sys_ppoll
+      6430,  // 337: sys_unshare
+      5081,  // 338: sys_set_robust_list
+      1558,  // 339: sys_get_robust_list
+      5784,  // 340: sys_splice
       196,   // 341: sys_arm_sync_file_range
-      5123,  // 342: sys_tee
-      5581,  // 343: sys_vmsplice
-      2472,  // 344: sys_move_pages
-      1272,  // 345: sys_getcpu
-      624,   // 346: sys_epoll_pwait
-      2042,  // 347: sys_kexec_load
-      5513,  // 348: sys_utimensat
-      4743,  // 349: sys_signalfd
-      5242,  // 350: sys_timerfd_create
-      674,   // 351: sys_eventfd
-      792,   // 352: sys_fallocate
-      5281,  // 353: sys_timerfd_settime
-      5261,  // 354: sys_timerfd_gettime
-      4756,  // 355: sys_signalfd4
-      686,   // 356: sys_eventfd2
-      574,   // 357: sys_epoll_create1
-      548,   // 358: sys_dup3
-      3005,  // 359: sys_pipe2
-      1815,  // 360: sys_inotify_init1
-      3118,  // 361: sys_preadv
-      3267,  // 362: sys_pwritev
-      3712,  // 363: sys_rt_tgsigqueueinfo
-      2960,  // 364: sys_perf_event_open
-      3428,  // 365: sys_recvmmsg
+      6015,  // 342: sys_tee
+      6578,  // 343: sys_vmsplice
+      3031,  // 344: sys_move_pages
+      1598,  // 345: sys_getcpu
+      776,   // 346: sys_epoll_pwait
+      2453,  // 347: sys_kexec_load
+      6489,  // 348: sys_utimensat
+      5656,  // 349: sys_signalfd
+      6174,  // 350: sys_timerfd_create
+      843,   // 351: sys_eventfd
+      976,   // 352: sys_fallocate
+      6235,  // 353: sys_timerfd_settime
+      6193,  // 354: sys_timerfd_gettime
+      5669,  // 355: sys_signalfd4
+      855,   // 356: sys_eventfd2
+      726,   // 357: sys_epoll_create1
+      700,   // 358: sys_dup3
+      3694,  // 359: sys_pipe2
+      2141,  // 360: sys_inotify_init1
+      3824,  // 361: sys_preadv
+      4034,  // 362: sys_pwritev
+      4542,  // 363: sys_rt_tgsigqueueinfo
+      3596,  // 364: sys_perf_event_open
+      4211,  // 365: sys_recvmmsg
       51,    // 366: sys_accept4
-      806,   // 367: sys_fanotify_init
-      824,   // 368: sys_fanotify_mark
-      3141,  // 369: sys_prlimit64
-      2706,  // 370: sys_name_to_handle_at
-      2857,  // 371: sys_open_by_handle_at
-      342,   // 372: sys_clock_adjtime
-      5067,  // 373: sys_syncfs
-      4114,  // 374: sys_sendmmsg
-      4386,  // 375: sys_setns
-      3155,  // 376: sys_process_vm_readv
-      3176,  // 377: sys_process_vm_writev
-      2013,  // 378: sys_kcmp
-      964,   // 379: sys_finit_module
-      3918,  // 380: sys_sched_setattr
-      3810,  // 381: sys_sched_getattr
-      3514,  // 382: sys_renameat2
-      3994,  // 383: sys_seccomp
-      1533,  // 384: sys_getrandom
-      2303,  // 385: sys_memfd_create
+      990,   // 367: sys_fanotify_init
+      1008,  // 368: sys_fanotify_mark
+      3847,  // 369: sys_prlimit64
+      3316,  // 370: sys_name_to_handle_at
+      3467,  // 371: sys_open_by_handle_at
+      356,   // 372: sys_clock_adjtime
+      5959,  // 373: sys_syncfs
+      4999,  // 374: sys_sendmmsg
+      5299,  // 375: sys_setns
+      3902,  // 376: sys_process_vm_readv
+      3923,  // 377: sys_process_vm_writev
+      2424,  // 378: sys_kcmp
+      1162,  // 379: sys_finit_module
+      4781,  // 380: sys_sched_setattr
+      4640,  // 381: sys_sched_getattr
+      4317,  // 382: sys_renameat2
+      4857,  // 383: sys_seccomp
+      1859,  // 384: sys_getrandom
+      2812,  // 385: sys_memfd_create
       241,   // 386: sys_bpf
-      710,   // 387: sys_execveat
-      5477,  // 388: sys_userfaultfd
-      2288,  // 389: sys_membarrier
-      2404,  // 390: sys_mlock2
-      465,   // 391: sys_copy_file_range
-      3129,  // 392: sys_preadv2
-      3279,  // 393: sys_pwritev2
-      3059,  // 394: sys_pkey_mprotect
-      3030,  // 395: sys_pkey_alloc
-      3045,  // 396: sys_pkey_free
-      4939,  // 397: sys_statx
-      3574,  // 398: sys_rseq
-      1900,  // 399: sys_io_pgetevents
+      879,   // 387: sys_execveat
+      6453,  // 388: sys_userfaultfd
+      2797,  // 389: sys_membarrier
+      2930,  // 390: sys_mlock2
+      617,   // 391: sys_copy_file_range
+      3835,  // 392: sys_preadv2
+      4046,  // 393: sys_pwritev2
+      3748,  // 394: sys_pkey_mprotect
+      3719,  // 395: sys_pkey_alloc
+      3734,  // 396: sys_pkey_free
+      5852,  // 397: sys_statx
+      4377,  // 398: sys_rseq
+      2226,  // 399: sys_io_pgetevents
+      2846,  // 400: sys_migrate_pages
+      2433,  // 401: sys_kexec_file_load
+      0,     // 402:
+      453,   // 403: sys_clock_gettime64
+      538,   // 404: sys_clock_settime64
+      374,   // 405: sys_clock_adjtime64
+      411,   // 406: sys_clock_getres_time64
+      493,   // 407: sys_clock_nanosleep_time64
+      6116,  // 408: sys_timer_gettime64
+      6154,  // 409: sys_timer_settime64
+      6213,  // 410: sys_timerfd_gettime64
+      6255,  // 411: sys_timerfd_settime64
+      6503,  // 412: sys_utimensat_time64
+      3978,  // 413: sys_pselect6_time64
+      3785,  // 414: sys_ppoll_time64
+      0,     // 415:
+      2244,  // 416: sys_io_pgetevents_time64
+      4224,  // 417: sys_recvmmsg_time64
+      3175,  // 418: sys_mq_timedsend_time64
+      3131,  // 419: sys_mq_timedreceive_time64
+      4940,  // 420: sys_semtimedop_time64
+      4515,  // 421: sys_rt_sigtimedwait_time64
+      1443,  // 422: sys_futex_time64
+      4726,  // 423: sys_sched_rr_get_interval_time64
+      3663,  // 424: sys_pidfd_send_signal
+      2337,  // 425: sys_io_uring_setup
+      2296,  // 426: sys_io_uring_enter
+      2315,  // 427: sys_io_uring_register
+      3489,  // 428: sys_open_tree
+      3016,  // 429: sys_move_mount
+      1269,  // 430: sys_fsopen
+      1230,  // 431: sys_fsconfig
+      1257,  // 432: sys_fsmount
+      1280,  // 433: sys_fspick
+      3648,  // 434: sys_pidfd_open
+      568,   // 435: sys_clone3
+      589,   // 436: sys_close_range
+      3514,  // 437: sys_openat2
+      3632,  // 438: sys_pidfd_getfd
+      930,   // 439: sys_faccessat2
+      3861,  // 440: sys_process_madvise
+      792,   // 441: sys_epoll_pwait2
+      2998,  // 442: sys_mount_setattr
+      4089,  // 443: sys_quotactl_fd
+      2510,  // 444: sys_landlock_create_ruleset
+      2488,  // 445: sys_landlock_add_rule
+      2538,  // 446: sys_landlock_restrict_self
+      0,     // 447:
+      3881,  // 448: sys_process_mrelease
+      1475,  // 449: sys_futex_waitv
+      5053,  // 450: sys_set_mempolicy_home_node
+      267,   // 451: sys_cachestat
+      1061,  // 452: sys_fchmodat2
+      2766,  // 453: sys_map_shadow_stack
+      1491,  // 454: sys_futex_wake
+      1460,  // 455: sys_futex_wait
+      1425,  // 456: sys_futex_requeue
   };
 };
 
 struct SyscallTable_x86 {
   static constexpr const char* names = kAllSyscalllNames;
   static constexpr SyscallTable::OffT offsets[]{
-      3544,  // 0: sys_restart_syscall
-      723,   // 1: sys_exit
-      1006,  // 2: sys_fork
-      3322,  // 3: sys_read
-      5639,  // 4: sys_write
-      2848,  // 5: sys_open
-      443,   // 6: sys_close
-      5627,  // 7: sys_waitpid
-      485,   // 8: sys_creat
-      2115,  // 9: sys_link
-      5430,  // 10: sys_unlink
-      699,   // 11: sys_execve
-      289,   // 12: sys_chdir
-      5142,  // 13: sys_time
-      2372,  // 14: sys_mknod
-      299,   // 15: sys_chmod
-      2077,  // 16: sys_lchown
+      4347,  // 0: sys_restart_syscall
+      892,   // 1: sys_exit
+      1204,  // 2: sys_fork
+      4105,  // 3: sys_read
+      6636,  // 4: sys_write
+      3458,  // 5: sys_open
+      579,   // 6: sys_close
+      6624,  // 7: sys_waitpid
+      637,   // 8: sys_creat
+      2603,  // 9: sys_link
+      6406,  // 10: sys_unlink
+      868,   // 11: sys_execve
+      303,   // 12: sys_chdir
+      6034,  // 13: sys_time
+      2898,  // 14: sys_mknod
+      313,   // 15: sys_chmod
+      2565,  // 16: sys_lchown
       249,   // 17: sys_break
-      2823,  // 18: sys_oldstat
-      2220,  // 19: sys_lseek
-      1482,  // 20: sys_getpid
-      2462,  // 21: sys_mount
-      5397,  // 22: sys_umount
-      4597,  // 23: sys_setuid
-      1705,  // 24: sys_getuid
-      4949,  // 25: sys_stime
-      3231,  // 26: sys_ptrace
+      3433,  // 18: sys_oldstat
+      2708,  // 19: sys_lseek
+      1808,  // 20: sys_getpid
+      2988,  // 21: sys_mount
+      6373,  // 22: sys_umount
+      5510,  // 23: sys_setuid
+      2031,  // 24: sys_getuid
+      5862,  // 25: sys_stime
+      3998,  // 26: sys_ptrace
       124,   // 27: sys_alarm
-      2781,  // 28: sys_oldfstat
-      2890,  // 29: sys_pause
-      5503,  // 30: sys_utime
-      4959,  // 31: sys_stty
-      1742,  // 32: sys_gtty
+      3391,  // 28: sys_oldfstat
+      3526,  // 29: sys_pause
+      6479,  // 30: sys_utime
+      5872,  // 31: sys_stty
+      2068,  // 32: sys_gtty
       63,    // 33: sys_access
-      2772,  // 34: sys_nice
-      1130,  // 35: sys_ftime
-      5017,  // 36: sys_sync
-      2068,  // 37: sys_kill
-      3490,  // 38: sys_rename
-      2350,  // 39: sys_mkdir
-      3564,  // 40: sys_rmdir
-      531,   // 41: sys_dup
-      2996,  // 42: sys_pipe
-      5301,  // 43: sys_times
-      3198,  // 44: sys_prof
+      3382,  // 34: sys_nice
+      1375,  // 35: sys_ftime
+      5930,  // 36: sys_sync
+      2479,  // 37: sys_kill
+      4293,  // 38: sys_rename
+      2876,  // 39: sys_mkdir
+      4367,  // 40: sys_rmdir
+      683,   // 41: sys_dup
+      3685,  // 42: sys_pipe
+      6277,  // 43: sys_times
+      3945,  // 44: sys_prof
       259,   // 45: sys_brk
-      4302,  // 46: sys_setgid
-      1374,  // 47: sys_getgid
-      4732,  // 48: sys_signal
-      1348,  // 49: sys_geteuid
-      1322,  // 50: sys_getegid
+      5215,  // 46: sys_setgid
+      1700,  // 47: sys_getgid
+      5645,  // 48: sys_signal
+      1674,  // 49: sys_geteuid
+      1648,  // 50: sys_getegid
       74,    // 51: sys_acct
-      5408,  // 52: sys_umount2
-      2175,  // 53: sys_lock
-      1945,  // 54: sys_ioctl
-      914,   // 55: sys_fcntl
-      2500,  // 56: sys_mpx
-      4396,  // 57: sys_setpgid
-      5376,  // 58: sys_ulimit
-      2807,  // 59: sys_oldolduname
-      5387,  // 60: sys_umask
-      331,   // 61: sys_chroot
-      5493,  // 62: sys_ustat
-      539,   // 63: sys_dup2
-      1505,  // 64: sys_getppid
-      1470,  // 65: sys_getpgrp
-      4554,  // 66: sys_setsid
-      4702,  // 67: sys_sigaction
-      4634,  // 68: sys_sgetmask
-      4882,  // 69: sys_ssetmask
-      4512,  // 70: sys_setreuid
-      4424,  // 71: sys_setregid
-      4815,  // 72: sys_sigsuspend
-      4770,  // 73: sys_sigpending
-      4356,  // 74: sys_sethostname
-      4540,  // 75: sys_setrlimit
-      1607,  // 76: sys_getrlimit
-      1621,  // 77: sys_getrusage
-      1688,  // 78: sys_gettimeofday
-      4580,  // 79: sys_settimeofday
-      1398,  // 80: sys_getgroups
-      4326,  // 81: sys_setgroups
-      4019,  // 82: sys_select
-      4991,  // 83: sys_symlink
-      2794,  // 84: sys_oldlstat
-      3357,  // 85: sys_readlink
-      5466,  // 86: sys_uselib
-      4980,  // 87: sys_swapon
-      3395,  // 88: sys_reboot
-      3345,  // 89: sys_readdir
-      2428,  // 90: sys_mmap
-      2695,  // 91: sys_munmap
-      5321,  // 92: sys_truncate
-      1140,  // 93: sys_ftruncate
-      853,   // 94: sys_fchmod
-      877,   // 95: sys_fchown
-      1517,  // 96: sys_getpriority
-      4408,  // 97: sys_setpriority
-      3207,  // 98: sys_profil
-      4915,  // 99: sys_statfs
-      1094,  // 100: sys_fstatfs
-      1955,  // 101: sys_ioperm
-      4841,  // 102: sys_socketcall
-      5112,  // 103: sys_syslog
-      4372,  // 104: sys_setitimer
-      1428,  // 105: sys_getitimer
-      4895,  // 106: sys_stat
-      2244,  // 107: sys_lstat
-      1046,  // 108: sys_fstat
-      2835,  // 109: sys_olduname
-      1966,  // 110: sys_iopl
-      5548,  // 111: sys_vhangup
-      1751,  // 112: sys_idle
-      5569,  // 113: sys_vm86old
-      5606,  // 114: sys_wait4
-      4968,  // 115: sys_swapoff
-      5100,  // 116: sys_sysinfo
-      2005,  // 117: sys_ipc
-      1120,  // 118: sys_fsync
-      4801,  // 119: sys_sigreturn
-      433,   // 120: sys_clone
-      4228,  // 121: sys_setdomainname
-      5420,  // 122: sys_uname
-      2447,  // 123: sys_modify_ldt
+      6384,  // 52: sys_umount2
+      2663,  // 53: sys_lock
+      2356,  // 54: sys_ioctl
+      1112,  // 55: sys_fcntl
+      3059,  // 56: sys_mpx
+      5309,  // 57: sys_setpgid
+      6352,  // 58: sys_ulimit
+      3417,  // 59: sys_oldolduname
+      6363,  // 60: sys_umask
+      345,   // 61: sys_chroot
+      6469,  // 62: sys_ustat
+      691,   // 63: sys_dup2
+      1831,  // 64: sys_getppid
+      1796,  // 65: sys_getpgrp
+      5467,  // 66: sys_setsid
+      5615,  // 67: sys_sigaction
+      5547,  // 68: sys_sgetmask
+      5795,  // 69: sys_ssetmask
+      5425,  // 70: sys_setreuid
+      5337,  // 71: sys_setregid
+      5728,  // 72: sys_sigsuspend
+      5683,  // 73: sys_sigpending
+      5269,  // 74: sys_sethostname
+      5453,  // 75: sys_setrlimit
+      1933,  // 76: sys_getrlimit
+      1947,  // 77: sys_getrusage
+      2014,  // 78: sys_gettimeofday
+      5493,  // 79: sys_settimeofday
+      1724,  // 80: sys_getgroups
+      5239,  // 81: sys_setgroups
+      4882,  // 82: sys_select
+      5904,  // 83: sys_symlink
+      3404,  // 84: sys_oldlstat
+      4140,  // 85: sys_readlink
+      6442,  // 86: sys_uselib
+      5893,  // 87: sys_swapon
+      4178,  // 88: sys_reboot
+      4128,  // 89: sys_readdir
+      2954,  // 90: sys_mmap
+      3305,  // 91: sys_munmap
+      6297,  // 92: sys_truncate
+      1385,  // 93: sys_ftruncate
+      1037,  // 94: sys_fchmod
+      1075,  // 95: sys_fchown
+      1843,  // 96: sys_getpriority
+      5321,  // 97: sys_setpriority
+      3954,  // 98: sys_profil
+      5828,  // 99: sys_statfs
+      1339,  // 100: sys_fstatfs
+      2366,  // 101: sys_ioperm
+      5754,  // 102: sys_socketcall
+      6004,  // 103: sys_syslog
+      5285,  // 104: sys_setitimer
+      1754,  // 105: sys_getitimer
+      5808,  // 106: sys_stat
+      2732,  // 107: sys_lstat
+      1291,  // 108: sys_fstat
+      3445,  // 109: sys_olduname
+      2377,  // 110: sys_iopl
+      6545,  // 111: sys_vhangup
+      2077,  // 112: sys_idle
+      6566,  // 113: sys_vm86old
+      6603,  // 114: sys_wait4
+      5881,  // 115: sys_swapoff
+      5992,  // 116: sys_sysinfo
+      2416,  // 117: sys_ipc
+      1365,  // 118: sys_fsync
+      5714,  // 119: sys_sigreturn
+      558,   // 120: sys_clone
+      5141,  // 121: sys_setdomainname
+      6396,  // 122: sys_uname
+      2973,  // 123: sys_modify_ldt
       95,    // 124: sys_adjtimex
-      2487,  // 125: sys_mprotect
-      4785,  // 126: sys_sigprocmask
-      495,   // 127: sys_create_module
-      1760,  // 128: sys_init_module
-      513,   // 129: sys_delete_module
-      1194,  // 130: sys_get_kernel_syms
-      3309,  // 131: sys_quotactl
-      1458,  // 132: sys_getpgid
-      842,   // 133: sys_fchdir
+      3046,  // 125: sys_mprotect
+      5698,  // 126: sys_sigprocmask
+      647,   // 127: sys_create_module
+      2086,  // 128: sys_init_module
+      665,   // 129: sys_delete_module
+      1520,  // 130: sys_get_kernel_syms
+      4076,  // 131: sys_quotactl
+      1784,  // 132: sys_getpgid
+      1026,  // 133: sys_fchdir
       220,   // 134: sys_bdflush
-      5090,  // 135: sys_sysfs
-      2980,  // 136: sys_personality
+      5982,  // 135: sys_sysfs
+      3616,  // 136: sys_personality
       108,   // 137: sys_afs_syscall
-      4274,  // 138: sys_setfsuid
-      4246,  // 139: sys_setfsgid
+      5187,  // 138: sys_setfsuid
+      5159,  // 139: sys_setfsgid
       1,     // 140: sys__llseek
-      1294,  // 141: sys_getdents
+      1620,  // 141: sys_getdents
       13,    // 142: sys__newselect
-      996,   // 143: sys_flock
-      2658,  // 144: sys_msync
-      3385,  // 145: sys_readv
-      5649,  // 146: sys_writev
-      1635,  // 147: sys_getsid
-      936,   // 148: sys_fdatasync
+      1194,  // 143: sys_flock
+      3268,  // 144: sys_msync
+      4168,  // 145: sys_readv
+      6646,  // 146: sys_writev
+      1961,  // 147: sys_getsid
+      1134,  // 148: sys_fdatasync
       28,    // 149: sys__sysctl
-      2394,  // 150: sys_mlock
-      2668,  // 151: sys_munlock
-      2415,  // 152: sys_mlockall
-      2680,  // 153: sys_munlockall
-      3936,  // 154: sys_sched_setparam
-      3828,  // 155: sys_sched_getparam
-      3955,  // 156: sys_sched_setscheduler
-      3847,  // 157: sys_sched_getscheduler
-      3978,  // 158: sys_sched_yield
-      3734,  // 159: sys_sched_get_priority_max
-      3761,  // 160: sys_sched_get_priority_min
-      3870,  // 161: sys_sched_rr_get_interval
-      2728,  // 162: sys_nanosleep
-      2603,  // 163: sys_mremap
-      4482,  // 164: sys_setresuid
-      1577,  // 165: sys_getresuid
-      5560,  // 166: sys_vm86
-      3292,  // 167: sys_query_module
-      3077,  // 168: sys_poll
-      2757,  // 169: sys_nfsservctl
-      4452,  // 170: sys_setresgid
-      1547,  // 171: sys_getresgid
-      3096,  // 172: sys_prctl
-      3657,  // 173: sys_rt_sigreturn
-      3583,  // 174: sys_rt_sigaction
-      3618,  // 175: sys_rt_sigprocmask
-      3600,  // 176: sys_rt_sigpending
-      3692,  // 177: sys_rt_sigtimedwait
-      3637,  // 178: sys_rt_sigqueueinfo
-      3674,  // 179: sys_rt_sigsuspend
-      3106,  // 180: sys_pread64
-      3254,  // 181: sys_pwrite64
-      309,   // 182: sys_chown
-      1283,  // 183: sys_getcwd
-      267,   // 184: sys_capget
-      278,   // 185: sys_capset
-      4716,  // 186: sys_sigaltstack
-      4086,  // 187: sys_sendfile
-      1493,  // 188: sys_getpmsg
-      3242,  // 189: sys_putpmsg
-      5538,  // 190: sys_vfork
-      5361,  // 191: sys_ugetrlimit
-      2437,  // 192: sys_mmap2
-      5334,  // 193: sys_truncate64
-      1154,  // 194: sys_ftruncate64
-      4904,  // 195: sys_stat64
-      2254,  // 196: sys_lstat64
-      1056,  // 197: sys_fstat64
-      2088,  // 198: sys_lchown32
-      1716,  // 199: sys_getuid32
-      1385,  // 200: sys_getgid32
-      1360,  // 201: sys_geteuid32
-      1334,  // 202: sys_getegid32
-      4525,  // 203: sys_setreuid32
-      4437,  // 204: sys_setregid32
-      1412,  // 205: sys_getgroups32
-      4340,  // 206: sys_setgroups32
-      888,   // 207: sys_fchown32
-      4496,  // 208: sys_setresuid32
-      1591,  // 209: sys_getresuid32
-      4466,  // 210: sys_setresgid32
-      1561,  // 211: sys_getresgid32
-      319,   // 212: sys_chown32
-      4608,  // 213: sys_setuid32
-      4313,  // 214: sys_setgid32
-      4287,  // 215: sys_setfsuid32
-      4259,  // 216: sys_setfsgid32
-      3015,  // 217: sys_pivot_root
-      2338,  // 218: sys_mincore
-      2266,  // 219: sys_madvise
-      1307,  // 220: sys_getdents64
-      924,   // 221: sys_fcntl64
+      2920,  // 150: sys_mlock
+      3278,  // 151: sys_munlock
+      2941,  // 152: sys_mlockall
+      3290,  // 153: sys_munlockall
+      4799,  // 154: sys_sched_setparam
+      4658,  // 155: sys_sched_getparam
+      4818,  // 156: sys_sched_setscheduler
+      4677,  // 157: sys_sched_getscheduler
+      4841,  // 158: sys_sched_yield
+      4564,  // 159: sys_sched_get_priority_max
+      4591,  // 160: sys_sched_get_priority_min
+      4700,  // 161: sys_sched_rr_get_interval
+      3338,  // 162: sys_nanosleep
+      3213,  // 163: sys_mremap
+      5395,  // 164: sys_setresuid
+      1903,  // 165: sys_getresuid
+      6557,  // 166: sys_vm86
+      4059,  // 167: sys_query_module
+      3766,  // 168: sys_poll
+      3367,  // 169: sys_nfsservctl
+      5365,  // 170: sys_setresgid
+      1873,  // 171: sys_getresgid
+      3802,  // 172: sys_prctl
+      4460,  // 173: sys_rt_sigreturn
+      4386,  // 174: sys_rt_sigaction
+      4421,  // 175: sys_rt_sigprocmask
+      4403,  // 176: sys_rt_sigpending
+      4495,  // 177: sys_rt_sigtimedwait
+      4440,  // 178: sys_rt_sigqueueinfo
+      4477,  // 179: sys_rt_sigsuspend
+      3812,  // 180: sys_pread64
+      4021,  // 181: sys_pwrite64
+      323,   // 182: sys_chown
+      1609,  // 183: sys_getcwd
+      281,   // 184: sys_capget
+      292,   // 185: sys_capset
+      5629,  // 186: sys_sigaltstack
+      4971,  // 187: sys_sendfile
+      1819,  // 188: sys_getpmsg
+      4009,  // 189: sys_putpmsg
+      6535,  // 190: sys_vfork
+      6337,  // 191: sys_ugetrlimit
+      2963,  // 192: sys_mmap2
+      6310,  // 193: sys_truncate64
+      1399,  // 194: sys_ftruncate64
+      5817,  // 195: sys_stat64
+      2742,  // 196: sys_lstat64
+      1301,  // 197: sys_fstat64
+      2576,  // 198: sys_lchown32
+      2042,  // 199: sys_getuid32
+      1711,  // 200: sys_getgid32
+      1686,  // 201: sys_geteuid32
+      1660,  // 202: sys_getegid32
+      5438,  // 203: sys_setreuid32
+      5350,  // 204: sys_setregid32
+      1738,  // 205: sys_getgroups32
+      5253,  // 206: sys_setgroups32
+      1086,  // 207: sys_fchown32
+      5409,  // 208: sys_setresuid32
+      1917,  // 209: sys_getresuid32
+      5379,  // 210: sys_setresgid32
+      1887,  // 211: sys_getresgid32
+      333,   // 212: sys_chown32
+      5521,  // 213: sys_setuid32
+      5226,  // 214: sys_setgid32
+      5200,  // 215: sys_setfsuid32
+      5172,  // 216: sys_setfsgid32
+      3704,  // 217: sys_pivot_root
+      2864,  // 218: sys_mincore
+      2754,  // 219: sys_madvise
+      1633,  // 220: sys_getdents64
+      1122,  // 221: sys_fcntl64
       0,     // 222:
       0,     // 223:
-      1677,  // 224: sys_gettid
-      3331,  // 225: sys_readahead
-      4621,  // 226: sys_setxattr
-      2230,  // 227: sys_lsetxattr
-      1032,  // 228: sys_fsetxattr
-      1729,  // 229: sys_getxattr
-      2101,  // 230: sys_lgetxattr
-      950,   // 231: sys_fgetxattr
-      2146,  // 232: sys_listxattr
-      2160,  // 233: sys_llistxattr
-      981,   // 234: sys_flistxattr
-      3474,  // 235: sys_removexattr
-      2203,  // 236: sys_lremovexattr
-      1015,  // 237: sys_fremovexattr
-      5311,  // 238: sys_tkill
-      4099,  // 239: sys_sendfile64
-      1170,  // 240: sys_futex
-      3896,  // 241: sys_sched_setaffinity
-      3788,  // 242: sys_sched_getaffinity
-      4188,  // 243: sys_set_thread_area
-      1252,  // 244: sys_get_thread_area
-      1918,  // 245: sys_io_setup
-      1868,  // 246: sys_io_destroy
-      1883,  // 247: sys_io_getevents
-      1931,  // 248: sys_io_submit
-      1854,  // 249: sys_io_cancel
-      761,   // 250: sys_fadvise64
+      2003,  // 224: sys_gettid
+      4114,  // 225: sys_readahead
+      5534,  // 226: sys_setxattr
+      2718,  // 227: sys_lsetxattr
+      1243,  // 228: sys_fsetxattr
+      2055,  // 229: sys_getxattr
+      2589,  // 230: sys_lgetxattr
+      1148,  // 231: sys_fgetxattr
+      2634,  // 232: sys_listxattr
+      2648,  // 233: sys_llistxattr
+      1179,  // 234: sys_flistxattr
+      4277,  // 235: sys_removexattr
+      2691,  // 236: sys_lremovexattr
+      1213,  // 237: sys_fremovexattr
+      6287,  // 238: sys_tkill
+      4984,  // 239: sys_sendfile64
+      1415,  // 240: sys_futex
+      4759,  // 241: sys_sched_setaffinity
+      4618,  // 242: sys_sched_getaffinity
+      5101,  // 243: sys_set_thread_area
+      1578,  // 244: sys_get_thread_area
+      2269,  // 245: sys_io_setup
+      2194,  // 246: sys_io_destroy
+      2209,  // 247: sys_io_getevents
+      2282,  // 248: sys_io_submit
+      2180,  // 249: sys_io_cancel
+      945,   // 250: sys_fadvise64
       0,     // 251:
-      732,   // 252: sys_exit_group
-      2184,  // 253: sys_lookup_dcookie
-      557,   // 254: sys_epoll_create
-      592,   // 255: sys_epoll_ctl
-      640,   // 256: sys_epoll_wait
-      3453,  // 257: sys_remap_file_pages
-      4208,  // 258: sys_set_tid_address
-      5151,  // 259: sys_timer_create
-      5224,  // 260: sys_timer_settime
-      5206,  // 261: sys_timer_gettime
-      5185,  // 262: sys_timer_getoverrun
-      5168,  // 263: sys_timer_delete
-      415,   // 264: sys_clock_settime
-      377,   // 265: sys_clock_gettime
-      360,   // 266: sys_clock_getres
-      395,   // 267: sys_clock_nanosleep
-      4926,  // 268: sys_statfs64
-      1106,  // 269: sys_fstatfs64
-      5131,  // 270: sys_tgkill
-      5527,  // 271: sys_utimes
-      775,   // 272: sys_fadvise64_64
-      5594,  // 273: sys_vserver
-      2278,  // 274: sys_mbind
-      1214,  // 275: sys_get_mempolicy
-      4150,  // 276: sys_set_mempolicy
-      2540,  // 277: sys_mq_open
-      2589,  // 278: sys_mq_unlink
-      2572,  // 279: sys_mq_timedsend
-      2552,  // 280: sys_mq_timedreceive
-      2526,  // 281: sys_mq_notify
-      2508,  // 282: sys_mq_getsetattr
-      2042,  // 283: sys_kexec_load
-      5616,  // 284: sys_waitid
+      901,   // 252: sys_exit_group
+      2672,  // 253: sys_lookup_dcookie
+      709,   // 254: sys_epoll_create
+      744,   // 255: sys_epoll_ctl
+      809,   // 256: sys_epoll_wait
+      4256,  // 257: sys_remap_file_pages
+      5121,  // 258: sys_set_tid_address
+      6043,  // 259: sys_timer_create
+      6136,  // 260: sys_timer_settime
+      6098,  // 261: sys_timer_gettime
+      6077,  // 262: sys_timer_getoverrun
+      6060,  // 263: sys_timer_delete
+      520,   // 264: sys_clock_settime
+      435,   // 265: sys_clock_gettime
+      394,   // 266: sys_clock_getres
+      473,   // 267: sys_clock_nanosleep
+      5839,  // 268: sys_statfs64
+      1351,  // 269: sys_fstatfs64
+      6023,  // 270: sys_tgkill
+      6524,  // 271: sys_utimes
+      959,   // 272: sys_fadvise64_64
+      6591,  // 273: sys_vserver
+      2787,  // 274: sys_mbind
+      1540,  // 275: sys_get_mempolicy
+      5035,  // 276: sys_set_mempolicy
+      3099,  // 277: sys_mq_open
+      3199,  // 278: sys_mq_unlink
+      3158,  // 279: sys_mq_timedsend
+      3111,  // 280: sys_mq_timedreceive
+      3085,  // 281: sys_mq_notify
+      3067,  // 282: sys_mq_getsetattr
+      2453,  // 283: sys_kexec_load
+      6613,  // 284: sys_waitid
       0,     // 285:
       83,    // 286: sys_add_key
-      3528,  // 287: sys_request_key
-      2057,  // 288: sys_keyctl
-      1990,  // 289: sys_ioprio_set
-      1975,  // 290: sys_ioprio_get
-      1798,  // 291: sys_inotify_init
-      1776,  // 292: sys_inotify_add_watch
-      1833,  // 293: sys_inotify_rm_watch
-      2320,  // 294: sys_migrate_pages
-      2879,  // 295: sys_openat
-      2360,  // 296: sys_mkdirat
-      2382,  // 297: sys_mknodat
-      901,   // 298: sys_fchownat
-      1180,  // 299: sys_futimesat
-      1080,  // 300: sys_fstatat64
-      5441,  // 301: sys_unlinkat
-      3501,  // 302: sys_renameat
-      2124,  // 303: sys_linkat
-      5003,  // 304: sys_symlinkat
-      3370,  // 305: sys_readlinkat
-      864,   // 306: sys_fchmodat
-      747,   // 307: sys_faccessat
-      3218,  // 308: sys_pselect6
-      3086,  // 309: sys_ppoll
-      5454,  // 310: sys_unshare
-      4168,  // 311: sys_set_robust_list
-      1232,  // 312: sys_get_robust_list
-      4871,  // 313: sys_splice
-      5026,  // 314: sys_sync_file_range
-      5123,  // 315: sys_tee
-      5581,  // 316: sys_vmsplice
-      2472,  // 317: sys_move_pages
-      1272,  // 318: sys_getcpu
-      624,   // 319: sys_epoll_pwait
-      5513,  // 320: sys_utimensat
-      4743,  // 321: sys_signalfd
-      5242,  // 322: sys_timerfd_create
-      674,   // 323: sys_eventfd
-      792,   // 324: sys_fallocate
-      5281,  // 325: sys_timerfd_settime
-      5261,  // 326: sys_timerfd_gettime
-      4756,  // 327: sys_signalfd4
-      686,   // 328: sys_eventfd2
-      574,   // 329: sys_epoll_create1
-      548,   // 330: sys_dup3
-      3005,  // 331: sys_pipe2
-      1815,  // 332: sys_inotify_init1
-      3118,  // 333: sys_preadv
-      3267,  // 334: sys_pwritev
-      3712,  // 335: sys_rt_tgsigqueueinfo
-      2960,  // 336: sys_perf_event_open
-      3428,  // 337: sys_recvmmsg
-      806,   // 338: sys_fanotify_init
-      824,   // 339: sys_fanotify_mark
-      3141,  // 340: sys_prlimit64
-      2706,  // 341: sys_name_to_handle_at
-      2857,  // 342: sys_open_by_handle_at
-      342,   // 343: sys_clock_adjtime
-      5067,  // 344: sys_syncfs
-      4114,  // 345: sys_sendmmsg
-      4386,  // 346: sys_setns
-      3155,  // 347: sys_process_vm_readv
-      3176,  // 348: sys_process_vm_writev
-      2013,  // 349: sys_kcmp
-      964,   // 350: sys_finit_module
-      3918,  // 351: sys_sched_setattr
-      3810,  // 352: sys_sched_getattr
-      3514,  // 353: sys_renameat2
-      3994,  // 354: sys_seccomp
-      1533,  // 355: sys_getrandom
-      2303,  // 356: sys_memfd_create
+      4331,  // 287: sys_request_key
+      2468,  // 288: sys_keyctl
+      2401,  // 289: sys_ioprio_set
+      2386,  // 290: sys_ioprio_get
+      2124,  // 291: sys_inotify_init
+      2102,  // 292: sys_inotify_add_watch
+      2159,  // 293: sys_inotify_rm_watch
+      2846,  // 294: sys_migrate_pages
+      3503,  // 295: sys_openat
+      2886,  // 296: sys_mkdirat
+      2908,  // 297: sys_mknodat
+      1099,  // 298: sys_fchownat
+      1506,  // 299: sys_futimesat
+      1325,  // 300: sys_fstatat64
+      6417,  // 301: sys_unlinkat
+      4304,  // 302: sys_renameat
+      2612,  // 303: sys_linkat
+      5916,  // 304: sys_symlinkat
+      4153,  // 305: sys_readlinkat
+      1048,  // 306: sys_fchmodat
+      916,   // 307: sys_faccessat
+      3965,  // 308: sys_pselect6
+      3775,  // 309: sys_ppoll
+      6430,  // 310: sys_unshare
+      5081,  // 311: sys_set_robust_list
+      1558,  // 312: sys_get_robust_list
+      5784,  // 313: sys_splice
+      5939,  // 314: sys_sync_file_range
+      6015,  // 315: sys_tee
+      6578,  // 316: sys_vmsplice
+      3031,  // 317: sys_move_pages
+      1598,  // 318: sys_getcpu
+      776,   // 319: sys_epoll_pwait
+      6489,  // 320: sys_utimensat
+      5656,  // 321: sys_signalfd
+      6174,  // 322: sys_timerfd_create
+      843,   // 323: sys_eventfd
+      976,   // 324: sys_fallocate
+      6235,  // 325: sys_timerfd_settime
+      6193,  // 326: sys_timerfd_gettime
+      5669,  // 327: sys_signalfd4
+      855,   // 328: sys_eventfd2
+      726,   // 329: sys_epoll_create1
+      700,   // 330: sys_dup3
+      3694,  // 331: sys_pipe2
+      2141,  // 332: sys_inotify_init1
+      3824,  // 333: sys_preadv
+      4034,  // 334: sys_pwritev
+      4542,  // 335: sys_rt_tgsigqueueinfo
+      3596,  // 336: sys_perf_event_open
+      4211,  // 337: sys_recvmmsg
+      990,   // 338: sys_fanotify_init
+      1008,  // 339: sys_fanotify_mark
+      3847,  // 340: sys_prlimit64
+      3316,  // 341: sys_name_to_handle_at
+      3467,  // 342: sys_open_by_handle_at
+      356,   // 343: sys_clock_adjtime
+      5959,  // 344: sys_syncfs
+      4999,  // 345: sys_sendmmsg
+      5299,  // 346: sys_setns
+      3902,  // 347: sys_process_vm_readv
+      3923,  // 348: sys_process_vm_writev
+      2424,  // 349: sys_kcmp
+      1162,  // 350: sys_finit_module
+      4781,  // 351: sys_sched_setattr
+      4640,  // 352: sys_sched_getattr
+      4317,  // 353: sys_renameat2
+      4857,  // 354: sys_seccomp
+      1859,  // 355: sys_getrandom
+      2812,  // 356: sys_memfd_create
       241,   // 357: sys_bpf
-      710,   // 358: sys_execveat
-      4830,  // 359: sys_socket
-      4856,  // 360: sys_socketpair
+      879,   // 358: sys_execveat
+      5743,  // 359: sys_socket
+      5769,  // 360: sys_socketpair
       232,   // 361: sys_bind
-      453,   // 362: sys_connect
-      2135,  // 363: sys_listen
+      605,   // 362: sys_connect
+      2623,  // 363: sys_listen
       51,    // 364: sys_accept4
-      1662,  // 365: sys_getsockopt
-      4565,  // 366: sys_setsockopt
-      1646,  // 367: sys_getsockname
-      1442,  // 368: sys_getpeername
-      4139,  // 369: sys_sendto
-      4127,  // 370: sys_sendmsg
-      3415,  // 371: sys_recvfrom
-      3441,  // 372: sys_recvmsg
-      4689,  // 373: sys_shutdown
-      5477,  // 374: sys_userfaultfd
-      2288,  // 375: sys_membarrier
-      2404,  // 376: sys_mlock2
-      465,   // 377: sys_copy_file_range
-      3129,  // 378: sys_preadv2
-      3279,  // 379: sys_pwritev2
-      3059,  // 380: sys_pkey_mprotect
-      3030,  // 381: sys_pkey_alloc
-      3045,  // 382: sys_pkey_free
-      4939,  // 383: sys_statx
+      1988,  // 365: sys_getsockopt
+      5478,  // 366: sys_setsockopt
+      1972,  // 367: sys_getsockname
+      1768,  // 368: sys_getpeername
+      5024,  // 369: sys_sendto
+      5012,  // 370: sys_sendmsg
+      4198,  // 371: sys_recvfrom
+      4244,  // 372: sys_recvmsg
+      5602,  // 373: sys_shutdown
+      6453,  // 374: sys_userfaultfd
+      2797,  // 375: sys_membarrier
+      2930,  // 376: sys_mlock2
+      617,   // 377: sys_copy_file_range
+      3835,  // 378: sys_preadv2
+      4046,  // 379: sys_pwritev2
+      3748,  // 380: sys_pkey_mprotect
+      3719,  // 381: sys_pkey_alloc
+      3734,  // 382: sys_pkey_free
+      5852,  // 383: sys_statx
       134,   // 384: sys_arch_prctl
-      1900,  // 385: sys_io_pgetevents
-      3574,  // 386: sys_rseq
+      2226,  // 385: sys_io_pgetevents
+      4377,  // 386: sys_rseq
+      0,     // 387:
+      0,     // 388:
+      0,     // 389:
+      0,     // 390:
+      0,     // 391:
+      0,     // 392:
+      4904,  // 393: sys_semget
+      4893,  // 394: sys_semctl
+      5591,  // 395: sys_shmget
+      5570,  // 396: sys_shmctl
+      5560,  // 397: sys_shmat
+      5581,  // 398: sys_shmdt
+      3235,  // 399: sys_msgget
+      3257,  // 400: sys_msgsnd
+      3246,  // 401: sys_msgrcv
+      3224,  // 402: sys_msgctl
+      453,   // 403: sys_clock_gettime64
+      538,   // 404: sys_clock_settime64
+      374,   // 405: sys_clock_adjtime64
+      411,   // 406: sys_clock_getres_time64
+      493,   // 407: sys_clock_nanosleep_time64
+      6116,  // 408: sys_timer_gettime64
+      6154,  // 409: sys_timer_settime64
+      6213,  // 410: sys_timerfd_gettime64
+      6255,  // 411: sys_timerfd_settime64
+      6503,  // 412: sys_utimensat_time64
+      3978,  // 413: sys_pselect6_time64
+      3785,  // 414: sys_ppoll_time64
+      0,     // 415:
+      2244,  // 416: sys_io_pgetevents_time64
+      4224,  // 417: sys_recvmmsg_time64
+      3175,  // 418: sys_mq_timedsend_time64
+      3131,  // 419: sys_mq_timedreceive_time64
+      4940,  // 420: sys_semtimedop_time64
+      4515,  // 421: sys_rt_sigtimedwait_time64
+      1443,  // 422: sys_futex_time64
+      4726,  // 423: sys_sched_rr_get_interval_time64
+      3663,  // 424: sys_pidfd_send_signal
+      2337,  // 425: sys_io_uring_setup
+      2296,  // 426: sys_io_uring_enter
+      2315,  // 427: sys_io_uring_register
+      3489,  // 428: sys_open_tree
+      3016,  // 429: sys_move_mount
+      1269,  // 430: sys_fsopen
+      1230,  // 431: sys_fsconfig
+      1257,  // 432: sys_fsmount
+      1280,  // 433: sys_fspick
+      3648,  // 434: sys_pidfd_open
+      568,   // 435: sys_clone3
+      589,   // 436: sys_close_range
+      3514,  // 437: sys_openat2
+      3632,  // 438: sys_pidfd_getfd
+      930,   // 439: sys_faccessat2
+      3861,  // 440: sys_process_madvise
+      792,   // 441: sys_epoll_pwait2
+      2998,  // 442: sys_mount_setattr
+      4089,  // 443: sys_quotactl_fd
+      2510,  // 444: sys_landlock_create_ruleset
+      2488,  // 445: sys_landlock_add_rule
+      2538,  // 446: sys_landlock_restrict_self
+      2829,  // 447: sys_memfd_secret
+      3881,  // 448: sys_process_mrelease
+      1475,  // 449: sys_futex_waitv
+      5053,  // 450: sys_set_mempolicy_home_node
+      267,   // 451: sys_cachestat
+      1061,  // 452: sys_fchmodat2
+      2766,  // 453: sys_map_shadow_stack
+      1491,  // 454: sys_futex_wake
+      1460,  // 455: sys_futex_wait
+      1425,  // 456: sys_futex_requeue
   };
 };
 
 struct SyscallTable_x86_64 {
   static constexpr const char* names = kAllSyscalllNames;
   static constexpr SyscallTable::OffT offsets[]{
-      3322,  // 0: sys_read
-      5639,  // 1: sys_write
-      2848,  // 2: sys_open
-      443,   // 3: sys_close
-      4895,  // 4: sys_stat
-      1046,  // 5: sys_fstat
-      2244,  // 6: sys_lstat
-      3077,  // 7: sys_poll
-      2220,  // 8: sys_lseek
-      2428,  // 9: sys_mmap
-      2487,  // 10: sys_mprotect
-      2695,  // 11: sys_munmap
+      4105,  // 0: sys_read
+      6636,  // 1: sys_write
+      3458,  // 2: sys_open
+      579,   // 3: sys_close
+      5808,  // 4: sys_stat
+      1291,  // 5: sys_fstat
+      2732,  // 6: sys_lstat
+      3766,  // 7: sys_poll
+      2708,  // 8: sys_lseek
+      2954,  // 9: sys_mmap
+      3046,  // 10: sys_mprotect
+      3305,  // 11: sys_munmap
       259,   // 12: sys_brk
-      3583,  // 13: sys_rt_sigaction
-      3618,  // 14: sys_rt_sigprocmask
-      3657,  // 15: sys_rt_sigreturn
-      1945,  // 16: sys_ioctl
-      3106,  // 17: sys_pread64
-      3254,  // 18: sys_pwrite64
-      3385,  // 19: sys_readv
-      5649,  // 20: sys_writev
+      4386,  // 13: sys_rt_sigaction
+      4421,  // 14: sys_rt_sigprocmask
+      4460,  // 15: sys_rt_sigreturn
+      2356,  // 16: sys_ioctl
+      3812,  // 17: sys_pread64
+      4021,  // 18: sys_pwrite64
+      4168,  // 19: sys_readv
+      6646,  // 20: sys_writev
       63,    // 21: sys_access
-      2996,  // 22: sys_pipe
-      4019,  // 23: sys_select
-      3978,  // 24: sys_sched_yield
-      2603,  // 25: sys_mremap
-      2658,  // 26: sys_msync
-      2338,  // 27: sys_mincore
-      2266,  // 28: sys_madvise
-      4678,  // 29: sys_shmget
-      4647,  // 30: sys_shmat
-      4657,  // 31: sys_shmctl
-      531,   // 32: sys_dup
-      539,   // 33: sys_dup2
-      2890,  // 34: sys_pause
-      2728,  // 35: sys_nanosleep
-      1428,  // 36: sys_getitimer
+      3685,  // 22: sys_pipe
+      4882,  // 23: sys_select
+      4841,  // 24: sys_sched_yield
+      3213,  // 25: sys_mremap
+      3268,  // 26: sys_msync
+      2864,  // 27: sys_mincore
+      2754,  // 28: sys_madvise
+      5591,  // 29: sys_shmget
+      5560,  // 30: sys_shmat
+      5570,  // 31: sys_shmctl
+      683,   // 32: sys_dup
+      691,   // 33: sys_dup2
+      3526,  // 34: sys_pause
+      3338,  // 35: sys_nanosleep
+      1754,  // 36: sys_getitimer
       124,   // 37: sys_alarm
-      4372,  // 38: sys_setitimer
-      1482,  // 39: sys_getpid
-      4086,  // 40: sys_sendfile
-      4830,  // 41: sys_socket
-      453,   // 42: sys_connect
+      5285,  // 38: sys_setitimer
+      1808,  // 39: sys_getpid
+      4971,  // 40: sys_sendfile
+      5743,  // 41: sys_socket
+      605,   // 42: sys_connect
       40,    // 43: sys_accept
-      4139,  // 44: sys_sendto
-      3415,  // 45: sys_recvfrom
-      4127,  // 46: sys_sendmsg
-      3441,  // 47: sys_recvmsg
-      4689,  // 48: sys_shutdown
+      5024,  // 44: sys_sendto
+      4198,  // 45: sys_recvfrom
+      5012,  // 46: sys_sendmsg
+      4244,  // 47: sys_recvmsg
+      5602,  // 48: sys_shutdown
       232,   // 49: sys_bind
-      2135,  // 50: sys_listen
-      1646,  // 51: sys_getsockname
-      1442,  // 52: sys_getpeername
-      4856,  // 53: sys_socketpair
-      4565,  // 54: sys_setsockopt
-      1662,  // 55: sys_getsockopt
-      433,   // 56: sys_clone
-      1006,  // 57: sys_fork
-      5538,  // 58: sys_vfork
-      699,   // 59: sys_execve
-      723,   // 60: sys_exit
-      5606,  // 61: sys_wait4
-      2068,  // 62: sys_kill
-      5420,  // 63: sys_uname
-      4041,  // 64: sys_semget
-      4052,  // 65: sys_semop
-      4030,  // 66: sys_semctl
-      4668,  // 67: sys_shmdt
-      2625,  // 68: sys_msgget
-      2647,  // 69: sys_msgsnd
-      2636,  // 70: sys_msgrcv
-      2614,  // 71: sys_msgctl
-      914,   // 72: sys_fcntl
-      996,   // 73: sys_flock
-      1120,  // 74: sys_fsync
-      936,   // 75: sys_fdatasync
-      5321,  // 76: sys_truncate
-      1140,  // 77: sys_ftruncate
-      1294,  // 78: sys_getdents
-      1283,  // 79: sys_getcwd
-      289,   // 80: sys_chdir
-      842,   // 81: sys_fchdir
-      3490,  // 82: sys_rename
-      2350,  // 83: sys_mkdir
-      3564,  // 84: sys_rmdir
-      485,   // 85: sys_creat
-      2115,  // 86: sys_link
-      5430,  // 87: sys_unlink
-      4991,  // 88: sys_symlink
-      3357,  // 89: sys_readlink
-      299,   // 90: sys_chmod
-      853,   // 91: sys_fchmod
-      309,   // 92: sys_chown
-      877,   // 93: sys_fchown
-      2077,  // 94: sys_lchown
-      5387,  // 95: sys_umask
-      1688,  // 96: sys_gettimeofday
-      1607,  // 97: sys_getrlimit
-      1621,  // 98: sys_getrusage
-      5100,  // 99: sys_sysinfo
-      5301,  // 100: sys_times
-      3231,  // 101: sys_ptrace
-      1705,  // 102: sys_getuid
-      5112,  // 103: sys_syslog
-      1374,  // 104: sys_getgid
-      4597,  // 105: sys_setuid
-      4302,  // 106: sys_setgid
-      1348,  // 107: sys_geteuid
-      1322,  // 108: sys_getegid
-      4396,  // 109: sys_setpgid
-      1505,  // 110: sys_getppid
-      1470,  // 111: sys_getpgrp
-      4554,  // 112: sys_setsid
-      4512,  // 113: sys_setreuid
-      4424,  // 114: sys_setregid
-      1398,  // 115: sys_getgroups
-      4326,  // 116: sys_setgroups
-      4482,  // 117: sys_setresuid
-      1577,  // 118: sys_getresuid
-      4452,  // 119: sys_setresgid
-      1547,  // 120: sys_getresgid
-      1458,  // 121: sys_getpgid
-      4274,  // 122: sys_setfsuid
-      4246,  // 123: sys_setfsgid
-      1635,  // 124: sys_getsid
-      267,   // 125: sys_capget
-      278,   // 126: sys_capset
-      3600,  // 127: sys_rt_sigpending
-      3692,  // 128: sys_rt_sigtimedwait
-      3637,  // 129: sys_rt_sigqueueinfo
-      3674,  // 130: sys_rt_sigsuspend
-      4716,  // 131: sys_sigaltstack
-      5503,  // 132: sys_utime
-      2372,  // 133: sys_mknod
-      5466,  // 134: sys_uselib
-      2980,  // 135: sys_personality
-      5493,  // 136: sys_ustat
-      4915,  // 137: sys_statfs
-      1094,  // 138: sys_fstatfs
-      5090,  // 139: sys_sysfs
-      1517,  // 140: sys_getpriority
-      4408,  // 141: sys_setpriority
-      3936,  // 142: sys_sched_setparam
-      3828,  // 143: sys_sched_getparam
-      3955,  // 144: sys_sched_setscheduler
-      3847,  // 145: sys_sched_getscheduler
-      3734,  // 146: sys_sched_get_priority_max
-      3761,  // 147: sys_sched_get_priority_min
-      3870,  // 148: sys_sched_rr_get_interval
-      2394,  // 149: sys_mlock
-      2668,  // 150: sys_munlock
-      2415,  // 151: sys_mlockall
-      2680,  // 152: sys_munlockall
-      5548,  // 153: sys_vhangup
-      2447,  // 154: sys_modify_ldt
-      3015,  // 155: sys_pivot_root
+      2623,  // 50: sys_listen
+      1972,  // 51: sys_getsockname
+      1768,  // 52: sys_getpeername
+      5769,  // 53: sys_socketpair
+      5478,  // 54: sys_setsockopt
+      1988,  // 55: sys_getsockopt
+      558,   // 56: sys_clone
+      1204,  // 57: sys_fork
+      6535,  // 58: sys_vfork
+      868,   // 59: sys_execve
+      892,   // 60: sys_exit
+      6603,  // 61: sys_wait4
+      2479,  // 62: sys_kill
+      6396,  // 63: sys_uname
+      4904,  // 64: sys_semget
+      4915,  // 65: sys_semop
+      4893,  // 66: sys_semctl
+      5581,  // 67: sys_shmdt
+      3235,  // 68: sys_msgget
+      3257,  // 69: sys_msgsnd
+      3246,  // 70: sys_msgrcv
+      3224,  // 71: sys_msgctl
+      1112,  // 72: sys_fcntl
+      1194,  // 73: sys_flock
+      1365,  // 74: sys_fsync
+      1134,  // 75: sys_fdatasync
+      6297,  // 76: sys_truncate
+      1385,  // 77: sys_ftruncate
+      1620,  // 78: sys_getdents
+      1609,  // 79: sys_getcwd
+      303,   // 80: sys_chdir
+      1026,  // 81: sys_fchdir
+      4293,  // 82: sys_rename
+      2876,  // 83: sys_mkdir
+      4367,  // 84: sys_rmdir
+      637,   // 85: sys_creat
+      2603,  // 86: sys_link
+      6406,  // 87: sys_unlink
+      5904,  // 88: sys_symlink
+      4140,  // 89: sys_readlink
+      313,   // 90: sys_chmod
+      1037,  // 91: sys_fchmod
+      323,   // 92: sys_chown
+      1075,  // 93: sys_fchown
+      2565,  // 94: sys_lchown
+      6363,  // 95: sys_umask
+      2014,  // 96: sys_gettimeofday
+      1933,  // 97: sys_getrlimit
+      1947,  // 98: sys_getrusage
+      5992,  // 99: sys_sysinfo
+      6277,  // 100: sys_times
+      3998,  // 101: sys_ptrace
+      2031,  // 102: sys_getuid
+      6004,  // 103: sys_syslog
+      1700,  // 104: sys_getgid
+      5510,  // 105: sys_setuid
+      5215,  // 106: sys_setgid
+      1674,  // 107: sys_geteuid
+      1648,  // 108: sys_getegid
+      5309,  // 109: sys_setpgid
+      1831,  // 110: sys_getppid
+      1796,  // 111: sys_getpgrp
+      5467,  // 112: sys_setsid
+      5425,  // 113: sys_setreuid
+      5337,  // 114: sys_setregid
+      1724,  // 115: sys_getgroups
+      5239,  // 116: sys_setgroups
+      5395,  // 117: sys_setresuid
+      1903,  // 118: sys_getresuid
+      5365,  // 119: sys_setresgid
+      1873,  // 120: sys_getresgid
+      1784,  // 121: sys_getpgid
+      5187,  // 122: sys_setfsuid
+      5159,  // 123: sys_setfsgid
+      1961,  // 124: sys_getsid
+      281,   // 125: sys_capget
+      292,   // 126: sys_capset
+      4403,  // 127: sys_rt_sigpending
+      4495,  // 128: sys_rt_sigtimedwait
+      4440,  // 129: sys_rt_sigqueueinfo
+      4477,  // 130: sys_rt_sigsuspend
+      5629,  // 131: sys_sigaltstack
+      6479,  // 132: sys_utime
+      2898,  // 133: sys_mknod
+      6442,  // 134: sys_uselib
+      3616,  // 135: sys_personality
+      6469,  // 136: sys_ustat
+      5828,  // 137: sys_statfs
+      1339,  // 138: sys_fstatfs
+      5982,  // 139: sys_sysfs
+      1843,  // 140: sys_getpriority
+      5321,  // 141: sys_setpriority
+      4799,  // 142: sys_sched_setparam
+      4658,  // 143: sys_sched_getparam
+      4818,  // 144: sys_sched_setscheduler
+      4677,  // 145: sys_sched_getscheduler
+      4564,  // 146: sys_sched_get_priority_max
+      4591,  // 147: sys_sched_get_priority_min
+      4700,  // 148: sys_sched_rr_get_interval
+      2920,  // 149: sys_mlock
+      3278,  // 150: sys_munlock
+      2941,  // 151: sys_mlockall
+      3290,  // 152: sys_munlockall
+      6545,  // 153: sys_vhangup
+      2973,  // 154: sys_modify_ldt
+      3704,  // 155: sys_pivot_root
       28,    // 156: sys__sysctl
-      3096,  // 157: sys_prctl
+      3802,  // 157: sys_prctl
       134,   // 158: sys_arch_prctl
       95,    // 159: sys_adjtimex
-      4540,  // 160: sys_setrlimit
-      331,   // 161: sys_chroot
-      5017,  // 162: sys_sync
+      5453,  // 160: sys_setrlimit
+      345,   // 161: sys_chroot
+      5930,  // 162: sys_sync
       74,    // 163: sys_acct
-      4580,  // 164: sys_settimeofday
-      2462,  // 165: sys_mount
-      5408,  // 166: sys_umount2
-      4980,  // 167: sys_swapon
-      4968,  // 168: sys_swapoff
-      3395,  // 169: sys_reboot
-      4356,  // 170: sys_sethostname
-      4228,  // 171: sys_setdomainname
-      1966,  // 172: sys_iopl
-      1955,  // 173: sys_ioperm
-      495,   // 174: sys_create_module
-      1760,  // 175: sys_init_module
-      513,   // 176: sys_delete_module
-      1194,  // 177: sys_get_kernel_syms
-      3292,  // 178: sys_query_module
-      3309,  // 179: sys_quotactl
-      2757,  // 180: sys_nfsservctl
-      1493,  // 181: sys_getpmsg
-      3242,  // 182: sys_putpmsg
+      5493,  // 164: sys_settimeofday
+      2988,  // 165: sys_mount
+      6384,  // 166: sys_umount2
+      5893,  // 167: sys_swapon
+      5881,  // 168: sys_swapoff
+      4178,  // 169: sys_reboot
+      5269,  // 170: sys_sethostname
+      5141,  // 171: sys_setdomainname
+      2377,  // 172: sys_iopl
+      2366,  // 173: sys_ioperm
+      647,   // 174: sys_create_module
+      2086,  // 175: sys_init_module
+      665,   // 176: sys_delete_module
+      1520,  // 177: sys_get_kernel_syms
+      4059,  // 178: sys_query_module
+      4076,  // 179: sys_quotactl
+      3367,  // 180: sys_nfsservctl
+      1819,  // 181: sys_getpmsg
+      4009,  // 182: sys_putpmsg
       108,   // 183: sys_afs_syscall
-      5349,  // 184: sys_tuxcall
-      4006,  // 185: sys_security
-      1677,  // 186: sys_gettid
-      3331,  // 187: sys_readahead
-      4621,  // 188: sys_setxattr
-      2230,  // 189: sys_lsetxattr
-      1032,  // 190: sys_fsetxattr
-      1729,  // 191: sys_getxattr
-      2101,  // 192: sys_lgetxattr
-      950,   // 193: sys_fgetxattr
-      2146,  // 194: sys_listxattr
-      2160,  // 195: sys_llistxattr
-      981,   // 196: sys_flistxattr
-      3474,  // 197: sys_removexattr
-      2203,  // 198: sys_lremovexattr
-      1015,  // 199: sys_fremovexattr
-      5311,  // 200: sys_tkill
-      5142,  // 201: sys_time
-      1170,  // 202: sys_futex
-      3896,  // 203: sys_sched_setaffinity
-      3788,  // 204: sys_sched_getaffinity
-      4188,  // 205: sys_set_thread_area
-      1918,  // 206: sys_io_setup
-      1868,  // 207: sys_io_destroy
-      1883,  // 208: sys_io_getevents
-      1931,  // 209: sys_io_submit
-      1854,  // 210: sys_io_cancel
-      1252,  // 211: sys_get_thread_area
-      2184,  // 212: sys_lookup_dcookie
-      557,   // 213: sys_epoll_create
-      606,   // 214: sys_epoll_ctl_old
-      655,   // 215: sys_epoll_wait_old
-      3453,  // 216: sys_remap_file_pages
-      1307,  // 217: sys_getdents64
-      4208,  // 218: sys_set_tid_address
-      3544,  // 219: sys_restart_syscall
-      4062,  // 220: sys_semtimedop
-      761,   // 221: sys_fadvise64
-      5151,  // 222: sys_timer_create
-      5224,  // 223: sys_timer_settime
-      5206,  // 224: sys_timer_gettime
-      5185,  // 225: sys_timer_getoverrun
-      5168,  // 226: sys_timer_delete
-      415,   // 227: sys_clock_settime
-      377,   // 228: sys_clock_gettime
-      360,   // 229: sys_clock_getres
-      395,   // 230: sys_clock_nanosleep
-      732,   // 231: sys_exit_group
-      640,   // 232: sys_epoll_wait
-      592,   // 233: sys_epoll_ctl
-      5131,  // 234: sys_tgkill
-      5527,  // 235: sys_utimes
-      5594,  // 236: sys_vserver
-      2278,  // 237: sys_mbind
-      4150,  // 238: sys_set_mempolicy
-      1214,  // 239: sys_get_mempolicy
-      2540,  // 240: sys_mq_open
-      2589,  // 241: sys_mq_unlink
-      2572,  // 242: sys_mq_timedsend
-      2552,  // 243: sys_mq_timedreceive
-      2526,  // 244: sys_mq_notify
-      2508,  // 245: sys_mq_getsetattr
-      2042,  // 246: sys_kexec_load
-      5616,  // 247: sys_waitid
+      6325,  // 184: sys_tuxcall
+      4869,  // 185: sys_security
+      2003,  // 186: sys_gettid
+      4114,  // 187: sys_readahead
+      5534,  // 188: sys_setxattr
+      2718,  // 189: sys_lsetxattr
+      1243,  // 190: sys_fsetxattr
+      2055,  // 191: sys_getxattr
+      2589,  // 192: sys_lgetxattr
+      1148,  // 193: sys_fgetxattr
+      2634,  // 194: sys_listxattr
+      2648,  // 195: sys_llistxattr
+      1179,  // 196: sys_flistxattr
+      4277,  // 197: sys_removexattr
+      2691,  // 198: sys_lremovexattr
+      1213,  // 199: sys_fremovexattr
+      6287,  // 200: sys_tkill
+      6034,  // 201: sys_time
+      1415,  // 202: sys_futex
+      4759,  // 203: sys_sched_setaffinity
+      4618,  // 204: sys_sched_getaffinity
+      5101,  // 205: sys_set_thread_area
+      2269,  // 206: sys_io_setup
+      2194,  // 207: sys_io_destroy
+      2209,  // 208: sys_io_getevents
+      2282,  // 209: sys_io_submit
+      2180,  // 210: sys_io_cancel
+      1578,  // 211: sys_get_thread_area
+      2672,  // 212: sys_lookup_dcookie
+      709,   // 213: sys_epoll_create
+      758,   // 214: sys_epoll_ctl_old
+      824,   // 215: sys_epoll_wait_old
+      4256,  // 216: sys_remap_file_pages
+      1633,  // 217: sys_getdents64
+      5121,  // 218: sys_set_tid_address
+      4347,  // 219: sys_restart_syscall
+      4925,  // 220: sys_semtimedop
+      945,   // 221: sys_fadvise64
+      6043,  // 222: sys_timer_create
+      6136,  // 223: sys_timer_settime
+      6098,  // 224: sys_timer_gettime
+      6077,  // 225: sys_timer_getoverrun
+      6060,  // 226: sys_timer_delete
+      520,   // 227: sys_clock_settime
+      435,   // 228: sys_clock_gettime
+      394,   // 229: sys_clock_getres
+      473,   // 230: sys_clock_nanosleep
+      901,   // 231: sys_exit_group
+      809,   // 232: sys_epoll_wait
+      744,   // 233: sys_epoll_ctl
+      6023,  // 234: sys_tgkill
+      6524,  // 235: sys_utimes
+      6591,  // 236: sys_vserver
+      2787,  // 237: sys_mbind
+      5035,  // 238: sys_set_mempolicy
+      1540,  // 239: sys_get_mempolicy
+      3099,  // 240: sys_mq_open
+      3199,  // 241: sys_mq_unlink
+      3158,  // 242: sys_mq_timedsend
+      3111,  // 243: sys_mq_timedreceive
+      3085,  // 244: sys_mq_notify
+      3067,  // 245: sys_mq_getsetattr
+      2453,  // 246: sys_kexec_load
+      6613,  // 247: sys_waitid
       83,    // 248: sys_add_key
-      3528,  // 249: sys_request_key
-      2057,  // 250: sys_keyctl
-      1990,  // 251: sys_ioprio_set
-      1975,  // 252: sys_ioprio_get
-      1798,  // 253: sys_inotify_init
-      1776,  // 254: sys_inotify_add_watch
-      1833,  // 255: sys_inotify_rm_watch
-      2320,  // 256: sys_migrate_pages
-      2879,  // 257: sys_openat
-      2360,  // 258: sys_mkdirat
-      2382,  // 259: sys_mknodat
-      901,   // 260: sys_fchownat
-      1180,  // 261: sys_futimesat
-      2742,  // 262: sys_newfstatat
-      5441,  // 263: sys_unlinkat
-      3501,  // 264: sys_renameat
-      2124,  // 265: sys_linkat
-      5003,  // 266: sys_symlinkat
-      3370,  // 267: sys_readlinkat
-      864,   // 268: sys_fchmodat
-      747,   // 269: sys_faccessat
-      3218,  // 270: sys_pselect6
-      3086,  // 271: sys_ppoll
-      5454,  // 272: sys_unshare
-      4168,  // 273: sys_set_robust_list
-      1232,  // 274: sys_get_robust_list
-      4871,  // 275: sys_splice
-      5123,  // 276: sys_tee
-      5026,  // 277: sys_sync_file_range
-      5581,  // 278: sys_vmsplice
-      2472,  // 279: sys_move_pages
-      5513,  // 280: sys_utimensat
-      624,   // 281: sys_epoll_pwait
-      4743,  // 282: sys_signalfd
-      5242,  // 283: sys_timerfd_create
-      674,   // 284: sys_eventfd
-      792,   // 285: sys_fallocate
-      5281,  // 286: sys_timerfd_settime
-      5261,  // 287: sys_timerfd_gettime
+      4331,  // 249: sys_request_key
+      2468,  // 250: sys_keyctl
+      2401,  // 251: sys_ioprio_set
+      2386,  // 252: sys_ioprio_get
+      2124,  // 253: sys_inotify_init
+      2102,  // 254: sys_inotify_add_watch
+      2159,  // 255: sys_inotify_rm_watch
+      2846,  // 256: sys_migrate_pages
+      3503,  // 257: sys_openat
+      2886,  // 258: sys_mkdirat
+      2908,  // 259: sys_mknodat
+      1099,  // 260: sys_fchownat
+      1506,  // 261: sys_futimesat
+      3352,  // 262: sys_newfstatat
+      6417,  // 263: sys_unlinkat
+      4304,  // 264: sys_renameat
+      2612,  // 265: sys_linkat
+      5916,  // 266: sys_symlinkat
+      4153,  // 267: sys_readlinkat
+      1048,  // 268: sys_fchmodat
+      916,   // 269: sys_faccessat
+      3965,  // 270: sys_pselect6
+      3775,  // 271: sys_ppoll
+      6430,  // 272: sys_unshare
+      5081,  // 273: sys_set_robust_list
+      1558,  // 274: sys_get_robust_list
+      5784,  // 275: sys_splice
+      6015,  // 276: sys_tee
+      5939,  // 277: sys_sync_file_range
+      6578,  // 278: sys_vmsplice
+      3031,  // 279: sys_move_pages
+      6489,  // 280: sys_utimensat
+      776,   // 281: sys_epoll_pwait
+      5656,  // 282: sys_signalfd
+      6174,  // 283: sys_timerfd_create
+      843,   // 284: sys_eventfd
+      976,   // 285: sys_fallocate
+      6235,  // 286: sys_timerfd_settime
+      6193,  // 287: sys_timerfd_gettime
       51,    // 288: sys_accept4
-      4756,  // 289: sys_signalfd4
-      686,   // 290: sys_eventfd2
-      574,   // 291: sys_epoll_create1
-      548,   // 292: sys_dup3
-      3005,  // 293: sys_pipe2
-      1815,  // 294: sys_inotify_init1
-      3118,  // 295: sys_preadv
-      3267,  // 296: sys_pwritev
-      3712,  // 297: sys_rt_tgsigqueueinfo
-      2960,  // 298: sys_perf_event_open
-      3428,  // 299: sys_recvmmsg
-      806,   // 300: sys_fanotify_init
-      824,   // 301: sys_fanotify_mark
-      3141,  // 302: sys_prlimit64
-      2706,  // 303: sys_name_to_handle_at
-      2857,  // 304: sys_open_by_handle_at
-      342,   // 305: sys_clock_adjtime
-      5067,  // 306: sys_syncfs
-      4114,  // 307: sys_sendmmsg
-      4386,  // 308: sys_setns
-      1272,  // 309: sys_getcpu
-      3155,  // 310: sys_process_vm_readv
-      3176,  // 311: sys_process_vm_writev
-      2013,  // 312: sys_kcmp
-      964,   // 313: sys_finit_module
-      3918,  // 314: sys_sched_setattr
-      3810,  // 315: sys_sched_getattr
-      3514,  // 316: sys_renameat2
-      3994,  // 317: sys_seccomp
-      1533,  // 318: sys_getrandom
-      2303,  // 319: sys_memfd_create
-      2022,  // 320: sys_kexec_file_load
+      5669,  // 289: sys_signalfd4
+      855,   // 290: sys_eventfd2
+      726,   // 291: sys_epoll_create1
+      700,   // 292: sys_dup3
+      3694,  // 293: sys_pipe2
+      2141,  // 294: sys_inotify_init1
+      3824,  // 295: sys_preadv
+      4034,  // 296: sys_pwritev
+      4542,  // 297: sys_rt_tgsigqueueinfo
+      3596,  // 298: sys_perf_event_open
+      4211,  // 299: sys_recvmmsg
+      990,   // 300: sys_fanotify_init
+      1008,  // 301: sys_fanotify_mark
+      3847,  // 302: sys_prlimit64
+      3316,  // 303: sys_name_to_handle_at
+      3467,  // 304: sys_open_by_handle_at
+      356,   // 305: sys_clock_adjtime
+      5959,  // 306: sys_syncfs
+      4999,  // 307: sys_sendmmsg
+      5299,  // 308: sys_setns
+      1598,  // 309: sys_getcpu
+      3902,  // 310: sys_process_vm_readv
+      3923,  // 311: sys_process_vm_writev
+      2424,  // 312: sys_kcmp
+      1162,  // 313: sys_finit_module
+      4781,  // 314: sys_sched_setattr
+      4640,  // 315: sys_sched_getattr
+      4317,  // 316: sys_renameat2
+      4857,  // 317: sys_seccomp
+      1859,  // 318: sys_getrandom
+      2812,  // 319: sys_memfd_create
+      2433,  // 320: sys_kexec_file_load
       241,   // 321: sys_bpf
-      710,   // 322: sys_execveat
-      5477,  // 323: sys_userfaultfd
-      2288,  // 324: sys_membarrier
-      2404,  // 325: sys_mlock2
-      465,   // 326: sys_copy_file_range
-      3129,  // 327: sys_preadv2
-      3279,  // 328: sys_pwritev2
-      3059,  // 329: sys_pkey_mprotect
-      3030,  // 330: sys_pkey_alloc
-      3045,  // 331: sys_pkey_free
-      4939,  // 332: sys_statx
-      1900,  // 333: sys_io_pgetevents
-      3574,  // 334: sys_rseq
+      879,   // 322: sys_execveat
+      6453,  // 323: sys_userfaultfd
+      2797,  // 324: sys_membarrier
+      2930,  // 325: sys_mlock2
+      617,   // 326: sys_copy_file_range
+      3835,  // 327: sys_preadv2
+      4046,  // 328: sys_pwritev2
+      3748,  // 329: sys_pkey_mprotect
+      3719,  // 330: sys_pkey_alloc
+      3734,  // 331: sys_pkey_free
+      5852,  // 332: sys_statx
+      2226,  // 333: sys_io_pgetevents
+      4377,  // 334: sys_rseq
       0,     // 335:
       0,     // 336:
       0,     // 337:
@@ -2355,39 +2292,39 @@
       0,     // 421:
       0,     // 422:
       0,     // 423:
-      0,     // 424:
-      0,     // 425:
-      0,     // 426:
-      0,     // 427:
-      0,     // 428:
-      0,     // 429:
-      0,     // 430:
-      0,     // 431:
-      0,     // 432:
-      0,     // 433:
-      0,     // 434:
-      0,     // 435:
-      0,     // 436:
-      0,     // 437:
-      0,     // 438:
-      0,     // 439:
-      0,     // 440:
-      0,     // 441:
-      0,     // 442:
-      0,     // 443:
-      0,     // 444:
-      0,     // 445:
-      0,     // 446:
-      0,     // 447:
-      0,     // 448:
-      0,     // 449:
-      0,     // 450:
-      0,     // 451:
-      0,     // 452:
-      0,     // 453:
-      0,     // 454:
-      0,     // 455:
-      0,     // 456:
+      3663,  // 424: sys_pidfd_send_signal
+      2337,  // 425: sys_io_uring_setup
+      2296,  // 426: sys_io_uring_enter
+      2315,  // 427: sys_io_uring_register
+      3489,  // 428: sys_open_tree
+      3016,  // 429: sys_move_mount
+      1269,  // 430: sys_fsopen
+      1230,  // 431: sys_fsconfig
+      1257,  // 432: sys_fsmount
+      1280,  // 433: sys_fspick
+      3648,  // 434: sys_pidfd_open
+      568,   // 435: sys_clone3
+      589,   // 436: sys_close_range
+      3514,  // 437: sys_openat2
+      3632,  // 438: sys_pidfd_getfd
+      930,   // 439: sys_faccessat2
+      3861,  // 440: sys_process_madvise
+      792,   // 441: sys_epoll_pwait2
+      2998,  // 442: sys_mount_setattr
+      4089,  // 443: sys_quotactl_fd
+      2510,  // 444: sys_landlock_create_ruleset
+      2488,  // 445: sys_landlock_add_rule
+      2538,  // 446: sys_landlock_restrict_self
+      2829,  // 447: sys_memfd_secret
+      3881,  // 448: sys_process_mrelease
+      1475,  // 449: sys_futex_waitv
+      5053,  // 450: sys_set_mempolicy_home_node
+      267,   // 451: sys_cachestat
+      1061,  // 452: sys_fchmodat2
+      2766,  // 453: sys_map_shadow_stack
+      1491,  // 454: sys_futex_wake
+      1460,  // 455: sys_futex_wait
+      1425,  // 456: sys_futex_requeue
       0,     // 457:
       0,     // 458:
       0,     // 459:
@@ -2443,42 +2380,42 @@
       0,     // 509:
       0,     // 510:
       0,     // 511:
-      3583,  // 512: sys_rt_sigaction
-      3657,  // 513: sys_rt_sigreturn
-      1945,  // 514: sys_ioctl
-      3385,  // 515: sys_readv
-      5649,  // 516: sys_writev
-      3415,  // 517: sys_recvfrom
-      4127,  // 518: sys_sendmsg
-      3441,  // 519: sys_recvmsg
-      699,   // 520: sys_execve
-      3231,  // 521: sys_ptrace
-      3600,  // 522: sys_rt_sigpending
-      3692,  // 523: sys_rt_sigtimedwait
-      3637,  // 524: sys_rt_sigqueueinfo
-      4716,  // 525: sys_sigaltstack
-      5151,  // 526: sys_timer_create
-      2526,  // 527: sys_mq_notify
-      2042,  // 528: sys_kexec_load
-      5616,  // 529: sys_waitid
-      4168,  // 530: sys_set_robust_list
-      1232,  // 531: sys_get_robust_list
-      5581,  // 532: sys_vmsplice
-      2472,  // 533: sys_move_pages
-      3118,  // 534: sys_preadv
-      3267,  // 535: sys_pwritev
-      3712,  // 536: sys_rt_tgsigqueueinfo
-      3428,  // 537: sys_recvmmsg
-      4114,  // 538: sys_sendmmsg
-      3155,  // 539: sys_process_vm_readv
-      3176,  // 540: sys_process_vm_writev
-      4565,  // 541: sys_setsockopt
-      1662,  // 542: sys_getsockopt
-      1918,  // 543: sys_io_setup
-      1931,  // 544: sys_io_submit
-      710,   // 545: sys_execveat
-      3129,  // 546: sys_preadv2
-      3279,  // 547: sys_pwritev2
+      4386,  // 512: sys_rt_sigaction
+      4460,  // 513: sys_rt_sigreturn
+      2356,  // 514: sys_ioctl
+      4168,  // 515: sys_readv
+      6646,  // 516: sys_writev
+      4198,  // 517: sys_recvfrom
+      5012,  // 518: sys_sendmsg
+      4244,  // 519: sys_recvmsg
+      868,   // 520: sys_execve
+      3998,  // 521: sys_ptrace
+      4403,  // 522: sys_rt_sigpending
+      4495,  // 523: sys_rt_sigtimedwait
+      4440,  // 524: sys_rt_sigqueueinfo
+      5629,  // 525: sys_sigaltstack
+      6043,  // 526: sys_timer_create
+      3085,  // 527: sys_mq_notify
+      2453,  // 528: sys_kexec_load
+      6613,  // 529: sys_waitid
+      5081,  // 530: sys_set_robust_list
+      1558,  // 531: sys_get_robust_list
+      6578,  // 532: sys_vmsplice
+      3031,  // 533: sys_move_pages
+      3824,  // 534: sys_preadv
+      4034,  // 535: sys_pwritev
+      4542,  // 536: sys_rt_tgsigqueueinfo
+      4211,  // 537: sys_recvmmsg
+      4999,  // 538: sys_sendmmsg
+      3902,  // 539: sys_process_vm_readv
+      3923,  // 540: sys_process_vm_writev
+      5478,  // 541: sys_setsockopt
+      1988,  // 542: sys_getsockopt
+      2269,  // 543: sys_io_setup
+      2282,  // 544: sys_io_submit
+      879,   // 545: sys_execveat
+      3835,  // 546: sys_preadv2
+      4046,  // 547: sys_pwritev2
   };
 };
 
diff --git a/src/kernel_utils/syscall_table_unittest.cc b/src/kernel_utils/syscall_table_unittest.cc
index 30390f3..c5bcc11 100644
--- a/src/kernel_utils/syscall_table_unittest.cc
+++ b/src/kernel_utils/syscall_table_unittest.cc
@@ -21,8 +21,8 @@
 namespace perfetto {
 namespace {
 
-TEST(SyscallTableTest, Aarch64) {
-  SyscallTable t(Architecture::kAarch64);
+TEST(SyscallTableTest, Arm64) {
+  SyscallTable t(Architecture::kArm64);
   EXPECT_STREQ(t.GetById(0), "sys_io_setup");
   EXPECT_EQ(t.GetByName("sys_io_setup"), 0u);
 
@@ -35,14 +35,14 @@
   EXPECT_STREQ(t.GetById(293), "sys_rseq");
   EXPECT_EQ(t.GetByName("sys_rseq"), 293u);
 
-  EXPECT_STREQ(t.GetById(294), nullptr);
+  EXPECT_STREQ(t.GetById(457), nullptr);
   EXPECT_STREQ(t.GetById(kMaxSyscalls), nullptr);
 
   EXPECT_EQ(t.GetByName("sys_non_existent"), std::nullopt);
 }
 
-TEST(SyscallTableTest, ArmEabi) {
-  SyscallTable t(Architecture::kArmEabi);
+TEST(SyscallTableTest, Arm32) {
+  SyscallTable t(Architecture::kArm32);
   EXPECT_STREQ(t.GetById(0), "sys_restart_syscall");
   EXPECT_EQ(t.GetByName("sys_restart_syscall"), 0u);
 
@@ -55,7 +55,7 @@
   EXPECT_STREQ(t.GetById(399), "sys_io_pgetevents");
   EXPECT_EQ(t.GetByName("sys_io_pgetevents"), 399u);
 
-  EXPECT_STREQ(t.GetById(400), nullptr);
+  EXPECT_STREQ(t.GetById(457), nullptr);
   EXPECT_STREQ(t.GetById(kMaxSyscalls), nullptr);
 
   EXPECT_EQ(t.GetByName("sys_non_existent"), std::nullopt);
@@ -100,7 +100,7 @@
   EXPECT_STREQ(t.GetById(386), "sys_rseq");
   EXPECT_EQ(t.GetByName("sys_rseq"), 386);
 
-  EXPECT_STREQ(t.GetById(387), nullptr);
+  EXPECT_STREQ(t.GetById(457), nullptr);
   EXPECT_STREQ(t.GetById(kMaxSyscalls), nullptr);
   EXPECT_EQ(t.GetByName("sys_non_existent"), std::nullopt);
 }
diff --git a/src/perfetto_cmd/perfetto_cmd.cc b/src/perfetto_cmd/perfetto_cmd.cc
index 37918c6..9d77c4b 100644
--- a/src/perfetto_cmd/perfetto_cmd.cc
+++ b/src/perfetto_cmd/perfetto_cmd.cc
@@ -39,6 +39,7 @@
 #include <fstream>
 #include <iostream>
 #include <iterator>
+#include <mutex>
 #include <random>
 #include <sstream>
 #include <thread>
@@ -50,6 +51,7 @@
 #include "perfetto/ext/base/ctrl_c_handler.h"
 #include "perfetto/ext/base/file_utils.h"
 #include "perfetto/ext/base/getopt.h"
+#include "perfetto/ext/base/no_destructor.h"
 #include "perfetto/ext/base/pipe.h"
 #include "perfetto/ext/base/string_view.h"
 #include "perfetto/ext/base/temp_file.h"
@@ -356,6 +358,11 @@
     return 1;
   }
 
+  // getopt is not thread safe and cmdline parsing requires a mutex for the case
+  // of concurrent cmdline parsing for bugreport snapshots.
+  static base::NoDestructor<std::mutex> getopt_mutex;
+  std::unique_lock<std::mutex> getopt_lock(getopt_mutex.ref());
+
   optind = 1;  // Reset getopt state. It's reused by the snapshot thread.
   for (;;) {
     int option =
@@ -565,6 +572,7 @@
     has_config_options = true;
     config_options.categories.push_back(argv[i]);
   }
+  getopt_lock.unlock();
 
   if (query_service_ && (is_detach() || is_attach() || background_)) {
     PERFETTO_ELOG("--query cannot be combined with any other argument");
diff --git a/src/trace_processor/BUILD.gn b/src/trace_processor/BUILD.gn
index c20ba5e..694b515 100644
--- a/src/trace_processor/BUILD.gn
+++ b/src/trace_processor/BUILD.gn
@@ -43,6 +43,26 @@
   }
 }
 
+# Depended upon by Chrome to do proto -> JSON conversion of traces.
+# Must be small binary size as all code here needs to be shipped in
+# Chrome.
+source_set("export_json") {
+  sources = [
+    "export_json.cc",
+    "export_json.h",
+  ]
+  deps = [
+    ":storage_minimal",
+    "../../gn:default_deps",
+    "../../include/perfetto/ext/trace_processor:export_json",
+    "../base",
+    "importers/json:minimal",
+    "storage",
+    "types",
+  ]
+  public_deps = [ "../../include/perfetto/ext/trace_processor:export_json" ]
+}
+
 source_set("metatrace") {
   sources = [
     "tp_metatrace.cc",
@@ -117,22 +137,6 @@
   public_deps = [ "../../include/perfetto/trace_processor:storage" ]
 }
 
-source_set("export_json") {
-  sources = [
-    "export_json.cc",
-    "export_json.h",
-  ]
-  deps = [
-    ":storage_minimal",
-    "../../gn:default_deps",
-    "../base",
-    "importers/json:minimal",
-    "storage",
-    "types",
-  ]
-  public_deps = [ "../../include/perfetto/ext/trace_processor:export_json" ]
-}
-
 if (enable_perfetto_trace_processor_sqlite) {
   source_set("lib") {
     sources = [
@@ -251,6 +255,7 @@
     deps += [
       ":export_json",
       "../../gn:jsoncpp",
+      "../../include/perfetto/ext/trace_processor:export_json",
       "containers",
       "importers/common",
       "importers/proto:minimal",
diff --git a/src/trace_processor/db/BUILD.gn b/src/trace_processor/db/BUILD.gn
index d602e28..cbd4304 100644
--- a/src/trace_processor/db/BUILD.gn
+++ b/src/trace_processor/db/BUILD.gn
@@ -15,7 +15,7 @@
 import("../../../gn/perfetto_tp_tables.gni")
 import("../../../gn/test.gni")
 
-source_set("db") {
+source_set("minimal") {
   sources = [
     "base_id.h",
     "column.cc",
@@ -26,8 +26,6 @@
     "compare.h",
     "query_executor.cc",
     "query_executor.h",
-    "runtime_table.cc",
-    "runtime_table.h",
     "table.cc",
     "table.h",
     "typed_column.h",
@@ -35,9 +33,8 @@
   ]
   deps = [
     "../../../gn:default_deps",
-    "../../../include/perfetto/base",
-    "../../../include/perfetto/ext/base",
     "../../../include/perfetto/trace_processor",
+    "../../base",
     "../containers",
     "../util:glob",
     "../util:regex",
@@ -46,6 +43,21 @@
   ]
 }
 
+source_set("db") {
+  sources = [
+    "runtime_table.cc",
+    "runtime_table.h",
+  ]
+  deps = [
+    "../../../gn:default_deps",
+    "../../../include/perfetto/trace_processor",
+    "../../base",
+    "../containers",
+    "column",
+  ]
+  public_deps = [ ":minimal" ]
+}
+
 source_set("compare") {
   sources = [ "compare.h" ]
   deps = [
@@ -89,6 +101,7 @@
       "../../base:test_support",
       "../containers",
       "../tables:tables_python",
+      "column",
     ]
     sources = [
       "column_storage_overlay_benchmark.cc",
diff --git a/src/trace_processor/db/column/BUILD.gn b/src/trace_processor/db/column/BUILD.gn
index daf9bbf..74d1611 100644
--- a/src/trace_processor/db/column/BUILD.gn
+++ b/src/trace_processor/db/column/BUILD.gn
@@ -45,8 +45,8 @@
   deps = [
     "../..:metatrace",
     "../../../../gn:default_deps",
+    "../../../../include/perfetto/trace_processor",
     "../../../../include/perfetto/trace_processor:basic_types",
-    "../../../../include/perfetto/trace_processor:trace_processor",
     "../../../../protos/perfetto/trace_processor:zero",
     "../../../base",
     "../../containers",
diff --git a/src/trace_processor/db/column/arrangement_overlay.cc b/src/trace_processor/db/column/arrangement_overlay.cc
index 65979ae..b9e3000 100644
--- a/src/trace_processor/db/column/arrangement_overlay.cc
+++ b/src/trace_processor/db/column/arrangement_overlay.cc
@@ -34,20 +34,6 @@
 
 namespace perfetto::trace_processor::column {
 
-ArrangementOverlay::ArrangementOverlay(const std::vector<uint32_t>* arrangement,
-                                       Indices::State arrangement_state,
-                                       bool does_arrangement_order_storage)
-    : arrangement_(arrangement),
-      arrangement_state_(arrangement_state),
-      does_arrangement_order_storage_(does_arrangement_order_storage) {}
-
-std::unique_ptr<DataLayerChain> ArrangementOverlay::MakeChain(
-    std::unique_ptr<DataLayerChain> inner) {
-  return std::make_unique<ChainImpl>(std::move(inner), arrangement_,
-                                     arrangement_state_,
-                                     does_arrangement_order_storage_);
-}
-
 ArrangementOverlay::ChainImpl::ChainImpl(
     std::unique_ptr<DataLayerChain> inner,
     const std::vector<uint32_t>* arrangement,
@@ -61,6 +47,13 @@
                   inner_->size());
 }
 
+SingleSearchResult ArrangementOverlay::ChainImpl::SingleSearch(
+    FilterOp op,
+    SqlValue sql_val,
+    uint32_t index) const {
+  return inner_->SingleSearch(op, sql_val, (*arrangement_)[index]);
+}
+
 SearchValidationResult ArrangementOverlay::ChainImpl::ValidateSearchConstraints(
     FilterOp op,
     SqlValue value) const {
@@ -156,14 +149,13 @@
               Indices::State::kNonmonotonic});
 }
 
-void ArrangementOverlay::ChainImpl::StableSort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
-}
-
-void ArrangementOverlay::ChainImpl::Sort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
+void ArrangementOverlay::ChainImpl::StableSort(SortToken* start,
+                                               SortToken* end,
+                                               SortDirection direction) const {
+  for (SortToken* it = start; it != end; ++it) {
+    it->index = (*arrangement_)[it->index];
+  }
+  inner_->StableSort(start, end, direction);
 }
 
 void ArrangementOverlay::ChainImpl::Serialize(StorageProto* storage) const {
diff --git a/src/trace_processor/db/column/arrangement_overlay.h b/src/trace_processor/db/column/arrangement_overlay.h
index b3064d0..bca884f 100644
--- a/src/trace_processor/db/column/arrangement_overlay.h
+++ b/src/trace_processor/db/column/arrangement_overlay.h
@@ -35,11 +35,12 @@
 class ArrangementOverlay final : public DataLayer {
  public:
   ArrangementOverlay(const std::vector<uint32_t>* arrangement,
-                     Indices::State arrangement_state,
-                     bool does_arrangement_order_storage);
+                     Indices::State arrangement_state);
+  ~ArrangementOverlay() override;
 
   std::unique_ptr<DataLayerChain> MakeChain(
-      std::unique_ptr<DataLayerChain>) override;
+      std::unique_ptr<DataLayerChain>,
+      ChainCreationArgs = ChainCreationArgs());
 
  private:
   class ChainImpl : public DataLayerChain {
@@ -49,6 +50,10 @@
               Indices::State arrangement_state,
               bool does_arrangement_order_storage);
 
+    SingleSearchResult SingleSearch(FilterOp,
+                                    SqlValue,
+                                    uint32_t) const override;
+
     SearchValidationResult ValidateSearchConstraints(FilterOp,
                                                      SqlValue) const override;
 
@@ -65,9 +70,9 @@
           "OrderedIndexSearch can't be called on ArrangementOverlay");
     }
 
-    void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
-    void Sort(uint32_t* rows, uint32_t rows_size) const override;
+    void StableSort(SortToken* start,
+                    SortToken* end,
+                    SortDirection) const override;
 
     void Serialize(StorageProto*) const override;
 
@@ -87,7 +92,6 @@
   std::unique_ptr<DataLayerChain> inner_;
   const std::vector<uint32_t>* arrangement_;
   const Indices::State arrangement_state_;
-  const bool does_arrangement_order_storage_;
 };
 
 }  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/arrangement_overlay_unittest.cc b/src/trace_processor/db/column/arrangement_overlay_unittest.cc
index 5da3c07..07f13c0 100644
--- a/src/trace_processor/db/column/arrangement_overlay_unittest.cc
+++ b/src/trace_processor/db/column/arrangement_overlay_unittest.cc
@@ -16,12 +16,15 @@
 
 #include "src/trace_processor/db/column/arrangement_overlay.h"
 
+#include <array>
 #include <cstdint>
 #include <vector>
 
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/db/column/data_layer.h"
 #include "src/trace_processor/db/column/fake_storage.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column/utils.h"
 #include "test/gtest_and_gmock.h"
@@ -32,63 +35,70 @@
 using testing::ElementsAre;
 using testing::IsEmpty;
 
+TEST(ArrangementOverlay, SingleSearch) {
+  std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
+  auto fake = FakeStorageChain::SearchSubset(5, std::vector<uint32_t>{1, 2});
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+  auto chain = storage.MakeChain(std::move(fake));
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 8),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 4),
+            SingleSearchResult::kNoMatch);
+}
+
 TEST(ArrangementOverlay, SearchAll) {
   std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
-  auto fake = FakeStorage::SearchAll(5);
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
-                             false);
-  auto queriable = storage.MakeChain(fake->MakeChain());
+  auto fake = FakeStorageChain::SearchAll(5);
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+  auto chain = storage.MakeChain(std::move(fake));
 
-  auto res = queriable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 4));
+  auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 4));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2u, 3u));
 }
 
 TEST(ArrangementOverlay, SearchNone) {
   std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
-  auto fake = FakeStorage::SearchNone(5);
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
-                             false);
-  auto queriable = storage.MakeChain(fake->MakeChain());
+  auto fake = FakeStorageChain::SearchNone(5);
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+  auto chain = storage.MakeChain(std::move(fake));
 
-  auto res = queriable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 4));
+  auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 4));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), IsEmpty());
 }
 
 TEST(ArrangementOverlay, DISABLED_SearchLimited) {
   std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
-  auto fake = FakeStorage::SearchSubset(5, Range(4, 5));
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
-                             false);
-  auto queriable = storage.MakeChain(fake->MakeChain());
+  auto fake = FakeStorageChain::SearchSubset(5, Range(4, 5));
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+  auto chain = storage.MakeChain(std::move(fake));
 
-  auto res = queriable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 7));
+  auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 7));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(6u));
 }
 
 TEST(ArrangementOverlay, SearchBitVector) {
   std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
-  auto fake = FakeStorage::SearchSubset(
+  auto fake = FakeStorageChain::SearchSubset(
       5, BitVector({false, true, false, true, false}));
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
-                             false);
-  auto queriable = storage.MakeChain(fake->MakeChain());
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+  auto chain = storage.MakeChain(std::move(fake));
 
   // Table bv:
   // 1, 1, 0, 0, 1, 1, 0, 0, 1, 1
-  auto res = queriable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 10));
+  auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 10));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 4, 5, 8, 9));
 }
 
 TEST(ArrangementOverlay, IndexSearch) {
   std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
-  auto fake = FakeStorage::SearchSubset(
+  auto fake = FakeStorageChain::SearchSubset(
       5, BitVector({false, true, false, true, false}));
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
-                             false);
-  auto queriable = storage.MakeChain(fake->MakeChain());
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> table_idx{7u, 1u, 3u};
-  RangeOrBitVector res = queriable->IndexSearch(
+  RangeOrBitVector res = chain->IndexSearch(
       FilterOp::kGe, SqlValue::Long(0u),
       Indices{table_idx.data(), static_cast<uint32_t>(table_idx.size()),
               Indices::State::kNonmonotonic});
@@ -98,16 +108,38 @@
 
 TEST(ArrangementOverlay, OrderingSearch) {
   std::vector<uint32_t> arrangement{0, 2, 4, 1, 3};
-  auto fake = FakeStorage::SearchSubset(
+  auto fake = FakeStorageChain::SearchSubset(
       5, BitVector({false, true, false, true, false}));
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic, true);
-  auto queriable = storage.MakeChain(fake->MakeChain());
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+  auto chain =
+      storage.MakeChain(std::move(fake), DataLayer::ChainCreationArgs(true));
 
   RangeOrBitVector res =
-      queriable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 5));
+      chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 5));
 
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3, 4));
 }
 
+TEST(ArrangementOverlay, StableSort) {
+  std::vector<uint32_t> numeric_data{0, 1, 2, 3, 4};
+  NumericStorage<uint32_t> numeric(&numeric_data, ColumnType::kUint32, false);
+
+  std::vector<uint32_t> arrangement{0, 2, 4, 1, 3};
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+  auto chain = storage.MakeChain(numeric.MakeChain());
+
+  std::vector tokens{
+      column::DataLayerChain::SortToken{0, 0},
+      column::DataLayerChain::SortToken{1, 1},
+      column::DataLayerChain::SortToken{2, 2},
+      column::DataLayerChain::SortToken{3, 3},
+      column::DataLayerChain::SortToken{4, 4},
+  };
+  chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                    column::DataLayerChain::SortDirection::kAscending);
+  ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+              ElementsAre(0, 3, 1, 4, 2));
+}
+
 }  // namespace
 }  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/data_layer.cc b/src/trace_processor/db/column/data_layer.cc
index d4bbcba..c8f8b68 100644
--- a/src/trace_processor/db/column/data_layer.cc
+++ b/src/trace_processor/db/column/data_layer.cc
@@ -16,9 +16,213 @@
 
 #include "src/trace_processor/db/column/data_layer.h"
 
+#include <cstdint>
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "perfetto/base/logging.h"
+#include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/containers/string_pool.h"
+#include "src/trace_processor/db/column/arrangement_overlay.h"
+#include "src/trace_processor/db/column/dense_null_overlay.h"
+#include "src/trace_processor/db/column/dummy_storage.h"
+#include "src/trace_processor/db/column/id_storage.h"
+#include "src/trace_processor/db/column/null_overlay.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
+#include "src/trace_processor/db/column/range_overlay.h"
+#include "src/trace_processor/db/column/selector_overlay.h"
+#include "src/trace_processor/db/column/set_id_storage.h"
+#include "src/trace_processor/db/column/string_storage.h"
+#include "src/trace_processor/db/column/types.h"
+
 namespace perfetto::trace_processor::column {
 
 DataLayer::~DataLayer() = default;
 DataLayerChain::~DataLayerChain() = default;
 
+// All the below code exists as machinery to allow dead-code-elimination
+// and linker symbol stripping to work for trace processor built into Chrome. It
+// is ugly and hacky but is the only way we could come up with to actually meet
+// both performance constraints and saving binary size in Chrome.
+//
+// TODO(b/325583551): investigate whether we can improve this at some point,
+// potentially removing this if Chrome no longer relies on trace processor for
+// JSON export.
+
+std::unique_ptr<DataLayerChain> DataLayer::MakeChain() {
+  switch (impl_) {
+    case Impl::kDummy:
+      return static_cast<DummyStorage*>(this)->MakeChain();
+    case Impl::kId:
+      return static_cast<IdStorage*>(this)->MakeChain();
+    case Impl::kNumericDouble:
+      return static_cast<NumericStorage<double>*>(this)->MakeChain();
+    case Impl::kNumericUint32:
+      return static_cast<NumericStorage<uint32_t>*>(this)->MakeChain();
+    case Impl::kNumericInt32:
+      return static_cast<NumericStorage<int32_t>*>(this)->MakeChain();
+    case Impl::kNumericInt64:
+      return static_cast<NumericStorage<int64_t>*>(this)->MakeChain();
+    case Impl::kSetId:
+      return static_cast<SetIdStorage*>(this)->MakeChain();
+    case Impl::kString:
+      return static_cast<StringStorage*>(this)->MakeChain();
+    case Impl::kArrangement:
+    case Impl::kDenseNull:
+    case Impl::kNull:
+    case Impl::kRange:
+    case Impl::kSelector:
+      PERFETTO_FATAL(
+          "Unexpected call to MakeChain(). MakeChain(DataLayerChain) should be "
+          "called instead");
+  }
+  PERFETTO_FATAL("For GCC");
+}
+
+std::unique_ptr<DataLayerChain> DataLayer::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs args) {
+  switch (impl_) {
+    case Impl::kArrangement:
+      return static_cast<ArrangementOverlay*>(this)->MakeChain(std::move(inner),
+                                                               args);
+    case Impl::kDenseNull:
+      return static_cast<DenseNullOverlay*>(this)->MakeChain(std::move(inner),
+                                                             args);
+    case Impl::kNull:
+      return static_cast<NullOverlay*>(this)->MakeChain(std::move(inner), args);
+    case Impl::kRange:
+      return static_cast<RangeOverlay*>(this)->MakeChain(std::move(inner),
+                                                         args);
+    case Impl::kSelector:
+      return static_cast<SelectorOverlay*>(this)->MakeChain(std::move(inner),
+                                                            args);
+    case Impl::kDummy:
+    case Impl::kId:
+    case Impl::kNumericDouble:
+    case Impl::kNumericUint32:
+    case Impl::kNumericInt32:
+    case Impl::kNumericInt64:
+    case Impl::kSetId:
+    case Impl::kString:
+      PERFETTO_FATAL(
+          "Unexpected call to MakeChain(DataLayerChain). MakeChain() should be "
+          "called instead");
+  }
+  PERFETTO_FATAL("For GCC");
+}
+
+ArrangementOverlay::ArrangementOverlay(const std::vector<uint32_t>* arrangement,
+                                       Indices::State arrangement_state)
+    : DataLayer(Impl::kArrangement),
+      arrangement_(arrangement),
+      arrangement_state_(arrangement_state) {}
+ArrangementOverlay::~ArrangementOverlay() = default;
+
+std::unique_ptr<DataLayerChain> ArrangementOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs args) {
+  return std::make_unique<ChainImpl>(std::move(inner), arrangement_,
+                                     arrangement_state_,
+                                     args.does_layer_order_chain_contents);
+}
+
+DenseNullOverlay::DenseNullOverlay(const BitVector* non_null)
+    : DataLayer(Impl::kDenseNull), non_null_(non_null) {}
+DenseNullOverlay::~DenseNullOverlay() = default;
+
+std::unique_ptr<DataLayerChain> DenseNullOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs) {
+  return std::make_unique<ChainImpl>(std::move(inner), non_null_);
+}
+
+std::unique_ptr<DataLayerChain> DummyStorage::MakeChain() {
+  return std::make_unique<ChainImpl>();
+}
+
+IdStorage::IdStorage() : DataLayer(Impl::kId) {}
+IdStorage::~IdStorage() = default;
+
+std::unique_ptr<DataLayerChain> IdStorage::MakeChain() {
+  return std::make_unique<ChainImpl>();
+}
+
+NullOverlay::NullOverlay(const BitVector* non_null)
+    : DataLayer(Impl::kNull), non_null_(non_null) {}
+NullOverlay::~NullOverlay() = default;
+
+std::unique_ptr<DataLayerChain> NullOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs) {
+  return std::make_unique<ChainImpl>(std::move(inner), non_null_);
+}
+
+NumericStorageBase::NumericStorageBase(ColumnType type,
+                                       bool is_sorted,
+                                       Impl impl)
+    : DataLayer(impl), storage_type_(type), is_sorted_(is_sorted) {}
+
+NumericStorageBase::~NumericStorageBase() = default;
+
+template <typename T>
+std::unique_ptr<DataLayerChain> NumericStorage<T>::MakeChain() {
+  return std::make_unique<ChainImpl>(vector_, storage_type_, is_sorted_);
+}
+
+template <typename T>
+NumericStorage<T>::NumericStorage(const std::vector<T>* vec,
+                                  ColumnType type,
+                                  bool is_sorted)
+    : NumericStorageBase(type, is_sorted, GetImpl()), vector_(vec) {}
+
+// Define explicit instantiation of the necessary templates here to reduce
+// binary size bloat.
+template class NumericStorage<double>;
+template class NumericStorage<uint32_t>;
+template class NumericStorage<int32_t>;
+template class NumericStorage<int64_t>;
+
+RangeOverlay::RangeOverlay(const Range* range)
+    : DataLayer(Impl::kRange), range_(range) {}
+RangeOverlay::~RangeOverlay() = default;
+
+std::unique_ptr<DataLayerChain> RangeOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs) {
+  return std::make_unique<ChainImpl>(std::move(inner), range_);
+}
+
+SelectorOverlay::SelectorOverlay(const BitVector* selector)
+    : DataLayer(Impl::kSelector), selector_(selector) {}
+SelectorOverlay::~SelectorOverlay() = default;
+
+std::unique_ptr<DataLayerChain> SelectorOverlay::MakeChain(
+    std::unique_ptr<DataLayerChain> inner,
+    ChainCreationArgs) {
+  return std::make_unique<ChainImpl>(std::move(inner), selector_);
+}
+
+SetIdStorage::SetIdStorage(const std::vector<uint32_t>* values)
+    : DataLayer(Impl::kSetId), values_(values) {}
+SetIdStorage::~SetIdStorage() = default;
+
+std::unique_ptr<DataLayerChain> SetIdStorage::MakeChain() {
+  return std::make_unique<ChainImpl>(values_);
+}
+
+StringStorage::StringStorage(StringPool* string_pool,
+                             const std::vector<StringPool::Id>* data,
+                             bool is_sorted)
+    : DataLayer(Impl::kString),
+      data_(data),
+      string_pool_(string_pool),
+      is_sorted_(is_sorted) {}
+StringStorage::~StringStorage() = default;
+
+std::unique_ptr<DataLayerChain> StringStorage::MakeChain() {
+  return std::make_unique<ChainImpl>(string_pool_, data_, is_sorted_);
+}
+
 }  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/data_layer.h b/src/trace_processor/db/column/data_layer.h
index 2419722..e069148 100644
--- a/src/trace_processor/db/column/data_layer.h
+++ b/src/trace_processor/db/column/data_layer.h
@@ -39,32 +39,85 @@
 // table.
 class DataLayer : public RefCounted {
  public:
+  // Arguments for MakeChain on how the inner chain should be interpreted.
+  struct ChainCreationArgs {
+    constexpr explicit ChainCreationArgs(
+        bool _does_layer_order_chain_contents = false)
+        : does_layer_order_chain_contents(_does_layer_order_chain_contents) {}
+
+    // Indicates whether the current data layer orders the inner chain.
+    // Currently used by ArrangementOverlay to decide whether the arrangement
+    // orders a given chain.
+    bool does_layer_order_chain_contents;
+  };
   virtual ~DataLayer();
 
   // Creates a DataLayerChain for a terminal DataLayer. This means the
   // DataLayer directly should return the data it contains inside.
-  virtual std::unique_ptr<DataLayerChain> MakeChain() {
-    PERFETTO_FATAL("Unimplemented");
-  }
+  std::unique_ptr<DataLayerChain> MakeChain();
 
   // Creates a DataLayerChain for a non-terminal DataLayer. This means
   // the DataLayer should transform the contents of the inner chain.
-  virtual std::unique_ptr<DataLayerChain> MakeChain(
-      std::unique_ptr<DataLayerChain>) {
-    PERFETTO_FATAL("Unimplemented");
-  }
+  std::unique_ptr<DataLayerChain> MakeChain(
+      std::unique_ptr<DataLayerChain>,
+      ChainCreationArgs = ChainCreationArgs());
+
+ protected:
+  // TODO(b/325583551): remove this when possible.
+  enum class Impl {
+    kArrangement,
+    kDenseNull,
+    kDummy,
+    kId,
+    kNull,
+    kNumericDouble,
+    kNumericUint32,
+    kNumericInt32,
+    kNumericInt64,
+    kRange,
+    kSelector,
+    kSetId,
+    kString,
+  };
+  explicit DataLayer(Impl impl) : impl_(impl) {}
+
+ private:
+  Impl impl_;
 };
 
 // Corresponds to a series of DataLayer chained together. Provides
 // functionality for querying the transformed data of the entire chain.
 class DataLayerChain {
  public:
+  // Indicates the direction of the sort on a single chain.
+  enum class SortDirection {
+    kAscending,
+    kDescending,
+  };
+  // Struct wrapping indices to elements of this chain. Passed to sorting
+  // functions.
+  struct SortToken {
+    // An index pointing to an element in this chain. Indicates the element
+    // at this index should be compared.
+    uint32_t index;
+
+    // An opaque value which can be set to some value meaningful to the
+    // caller. Implementations *should not* read at this value.
+    uint32_t payload;
+  };
   using StorageProto = protos::pbzero::SerializedColumn_Storage;
 
   virtual ~DataLayerChain();
 
   // Start of public API.
 
+  // Checks whether element at the the provided index match |op| and |value|.
+  //
+  // Returns true if the element matches, false otherwise.
+  virtual SingleSearchResult SingleSearch(FilterOp op,
+                                          SqlValue value,
+                                          uint32_t row) const = 0;
+
   // Searches for elements which match |op| and |value| between |range.start|
   // and |range.end|.
   //
@@ -151,13 +204,21 @@
     PERFETTO_FATAL("For GCC");
   }
 
-  // Sorts |rows| in ascending order with the comparator:
-  // data[rows[a]] < data[rows[b]].
-  virtual void Sort(uint32_t* rows, uint32_t rows_size) const = 0;
-
-  // Stable sorts |rows| in ascending order with the comparator:
-  // data[rows[a]] < data[rows[b]].
-  virtual void StableSort(uint32_t* rows, uint32_t rows_size) const = 0;
+  // Stable sorts an array of SortToken elements between |start| and |end|
+  // using a comparator defined by looking up the elements in this chain using
+  // the index given by SortToken::index. |direction| indicates the direction of
+  // the sort (ascending or descending).
+  //
+  // In simple terms the expectation is for implementations do something like:
+  // ```
+  // std::stable_sort(start, index, [](const SortToken& a, const SortToken& b) {
+  //  return Get(a.index) < Get(b.index);
+  // });
+  // ```
+  // with |Get| being a function to lookup the element in this chain.
+  virtual void StableSort(SortToken* start,
+                          SortToken* end,
+                          SortDirection direction) const = 0;
 
   // Serializes storage data to proto format.
   virtual void Serialize(StorageProto*) const = 0;
diff --git a/src/trace_processor/db/column/dense_null_overlay.cc b/src/trace_processor/db/column/dense_null_overlay.cc
index 7d37413..7dff76f 100644
--- a/src/trace_processor/db/column/dense_null_overlay.cc
+++ b/src/trace_processor/db/column/dense_null_overlay.cc
@@ -34,25 +34,39 @@
 
 namespace perfetto::trace_processor::column {
 
-DenseNullOverlay::DenseNullOverlay(const BitVector* non_null)
-    : non_null_(non_null) {}
-
-std::unique_ptr<DataLayerChain> DenseNullOverlay::MakeChain(
-    std::unique_ptr<DataLayerChain> inner) {
-  return std::make_unique<ChainImpl>(std::move(inner), non_null_);
-}
-
 DenseNullOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> inner,
                                        const BitVector* non_null)
     : inner_(std::move(inner)), non_null_(non_null) {}
 
+SingleSearchResult DenseNullOverlay::ChainImpl::SingleSearch(
+    FilterOp op,
+    SqlValue sql_val,
+    uint32_t index) const {
+  switch (op) {
+    case FilterOp::kIsNull:
+      return non_null_->IsSet(index) ? inner_->SingleSearch(op, sql_val, index)
+                                     : SingleSearchResult::kMatch;
+    case FilterOp::kIsNotNull:
+    case FilterOp::kEq:
+    case FilterOp::kGe:
+    case FilterOp::kGt:
+    case FilterOp::kLt:
+    case FilterOp::kLe:
+    case FilterOp::kNe:
+    case FilterOp::kGlob:
+    case FilterOp::kRegex:
+      return non_null_->IsSet(index) ? inner_->SingleSearch(op, sql_val, index)
+                                     : SingleSearchResult::kNoMatch;
+  }
+  PERFETTO_FATAL("For GCC");
+}
+
 SearchValidationResult DenseNullOverlay::ChainImpl::ValidateSearchConstraints(
     FilterOp op,
     SqlValue sql_val) const {
   if (op == FilterOp::kIsNull) {
     return SearchValidationResult::kOk;
   }
-
   return inner_->ValidateSearchConstraints(op, sql_val);
 }
 
@@ -212,14 +226,16 @@
           inner_range.end + non_null_offset};
 }
 
-void DenseNullOverlay::ChainImpl::StableSort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
-}
-
-void DenseNullOverlay::ChainImpl::Sort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
+void DenseNullOverlay::ChainImpl::StableSort(SortToken* start,
+                                             SortToken* end,
+                                             SortDirection direction) const {
+  SortToken* it = std::stable_partition(
+      start, end,
+      [this](const SortToken& idx) { return !non_null_->IsSet(idx.index); });
+  inner_->StableSort(it, end, direction);
+  if (direction == SortDirection::kDescending) {
+    std::rotate(start, it, end);
+  }
 }
 
 void DenseNullOverlay::ChainImpl::Serialize(StorageProto* storage) const {
diff --git a/src/trace_processor/db/column/dense_null_overlay.h b/src/trace_processor/db/column/dense_null_overlay.h
index d55f076..0f881fb 100644
--- a/src/trace_processor/db/column/dense_null_overlay.h
+++ b/src/trace_processor/db/column/dense_null_overlay.h
@@ -34,15 +34,21 @@
 class DenseNullOverlay final : public DataLayer {
  public:
   explicit DenseNullOverlay(const BitVector* non_null);
+  ~DenseNullOverlay() override;
 
   std::unique_ptr<DataLayerChain> MakeChain(
-      std::unique_ptr<DataLayerChain>) override;
+      std::unique_ptr<DataLayerChain>,
+      ChainCreationArgs = ChainCreationArgs());
 
  private:
   class ChainImpl : public DataLayerChain {
    public:
     ChainImpl(std::unique_ptr<DataLayerChain> inner, const BitVector* non_null);
 
+    SingleSearchResult SingleSearch(FilterOp,
+                                    SqlValue,
+                                    uint32_t) const override;
+
     SearchValidationResult ValidateSearchConstraints(FilterOp,
                                                      SqlValue) const override;
 
@@ -56,9 +62,9 @@
                                       SqlValue,
                                       Indices) const override;
 
-    void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
-    void Sort(uint32_t* rows, uint32_t rows_size) const override;
+    void StableSort(SortToken* start,
+                    SortToken* end,
+                    SortDirection) const override;
 
     void Serialize(StorageProto*) const override;
 
diff --git a/src/trace_processor/db/column/dense_null_overlay_unittest.cc b/src/trace_processor/db/column/dense_null_overlay_unittest.cc
index 9838a34..0cf6276 100644
--- a/src/trace_processor/db/column/dense_null_overlay_unittest.cc
+++ b/src/trace_processor/db/column/dense_null_overlay_unittest.cc
@@ -18,20 +18,18 @@
 
 #include <cstdint>
 #include <memory>
-#include <utility>
 #include <vector>
 
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/db/column/data_layer.h"
 #include "src/trace_processor/db/column/fake_storage.h"
 #include "src/trace_processor/db/column/numeric_storage.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column/utils.h"
 #include "test/gtest_and_gmock.h"
 
-namespace perfetto {
-namespace trace_processor {
-namespace column {
+namespace perfetto::trace_processor::column {
 namespace {
 
 using testing::ElementsAre;
@@ -39,8 +37,8 @@
 
 TEST(DenseNullOverlay, NoFilteringSearch) {
   std::vector<uint32_t> data{0, 1, 0, 1, 0};
-  auto numeric =
-      std::make_unique<NumericStorage<uint32_t>>(&data, ColumnType::kUint32);
+  auto numeric = std::make_unique<NumericStorage<uint32_t>>(
+      &data, ColumnType::kUint32, false);
 
   BitVector bv{0, 1, 0, 1, 0};
   DenseNullOverlay storage(&bv);
@@ -52,8 +50,8 @@
 
 TEST(DenseNullOverlay, RestrictInputSearch) {
   std::vector<uint32_t> data{0, 1, 0, 1, 0};
-  auto numeric =
-      std::make_unique<NumericStorage<uint32_t>>(&data, ColumnType::kUint32);
+  auto numeric = std::make_unique<NumericStorage<uint32_t>>(
+      &data, ColumnType::kUint32, false);
 
   BitVector bv{0, 1, 0, 1, 0};
   DenseNullOverlay storage(&bv);
@@ -64,33 +62,33 @@
 }
 
 TEST(DenseNullOverlay, RangeFilterSearch) {
-  auto fake = FakeStorage::SearchSubset(5, Range(1, 3));
+  auto fake = FakeStorageChain::SearchSubset(5, Range(1, 3));
 
   BitVector bv{0, 1, 0, 1, 0};
   DenseNullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0), Range(0, 5));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1));
 }
 
 TEST(DenseNullOverlay, BitvectorFilterSearch) {
-  auto fake = FakeStorage::SearchSubset(5, BitVector({0, 1, 1, 0, 0}));
+  auto fake = FakeStorageChain::SearchSubset(5, BitVector({0, 1, 1, 0, 0}));
 
   BitVector bv{0, 1, 0, 1, 0};
   DenseNullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0), Range(0, 5));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1));
 }
 
 TEST(DenseNullOverlay, IsNullSearch) {
-  auto fake = FakeStorage::SearchSubset(5, BitVector({1, 1, 0, 0, 1}));
+  auto fake = FakeStorageChain::SearchSubset(5, BitVector({1, 1, 0, 0, 1}));
 
   BitVector bv{1, 0, 0, 1, 1};
   DenseNullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kIsNull, SqlValue(), Range(0, 5));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2, 4));
@@ -98,8 +96,8 @@
 
 TEST(DenseNullOverlay, IndexSearch) {
   std::vector<uint32_t> data{1, 0, 0, 1, 1, 1};
-  auto numeric =
-      std::make_unique<NumericStorage<uint32_t>>(&data, ColumnType::kUint32);
+  auto numeric = std::make_unique<NumericStorage<uint32_t>>(
+      &data, ColumnType::kUint32, false);
 
   BitVector bv{1, 0, 0, 1, 1, 1};
   DenseNullOverlay storage(&bv);
@@ -114,11 +112,11 @@
 }
 
 TEST(DenseNullOverlay, IsNullIndexSearch) {
-  auto fake = FakeStorage::SearchSubset(6, BitVector({0, 0, 0, 1, 1, 1}));
+  auto fake = FakeStorageChain::SearchSubset(6, BitVector({0, 0, 0, 1, 1, 1}));
 
   BitVector bv{0, 1, 0, 1, 1, 1};
   DenseNullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> index({5, 2, 3, 4, 1});
   auto res = chain->IndexSearch(
@@ -129,11 +127,11 @@
 }
 
 TEST(DenseNullOverlay, OrderedIndexSearch) {
-  auto fake = FakeStorage::SearchSubset(6, BitVector({0, 1, 0, 1, 0, 1}));
+  auto fake = FakeStorageChain::SearchSubset(6, BitVector({0, 1, 0, 1, 0, 1}));
 
   BitVector bv{0, 1, 0, 1, 0, 1};
   DenseNullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> indices_vec({0, 2, 4, 1, 3, 5});
   Indices indices{indices_vec.data(), 6, Indices::State::kNonmonotonic};
@@ -167,7 +165,76 @@
   ASSERT_EQ(res.end, 6u);
 }
 
+TEST(DenseNullOverlay, SingleSearch) {
+  BitVector bv{0, 1, 0, 1, 1, 1};
+  DenseNullOverlay storage(&bv);
+  auto fake = FakeStorageChain::SearchSubset(5, std::vector<uint32_t>{1, 2});
+  auto chain = storage.MakeChain(std::move(fake));
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 1),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 2),
+            SingleSearchResult::kNoMatch);
+}
+
+TEST(DenseNullOverlay, SingleSearchIsNull) {
+  BitVector bv{0, 1, 0, 1, 1, 1};
+  DenseNullOverlay storage(&bv);
+  auto fake = FakeStorageChain::SearchNone(5);
+  auto chain = storage.MakeChain(std::move(fake));
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 0),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 1),
+            SingleSearchResult::kNoMatch);
+}
+
+TEST(DenseNullOverlay, SingleSearchIsNotNull) {
+  BitVector bv{0, 1, 0, 1, 1, 1};
+  DenseNullOverlay storage(&bv);
+  auto fake = FakeStorageChain::SearchAll(5);
+  auto chain = storage.MakeChain(std::move(fake));
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 0),
+            SingleSearchResult::kNoMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 1),
+            SingleSearchResult::kMatch);
+}
+
+TEST(DenseNullOverlay, StableSort) {
+  std::vector<uint32_t> numeric_data{0, 3, 0, 1, 0, 2, 4};
+  NumericStorage<uint32_t> numeric(&numeric_data, ColumnType::kUint32, false);
+
+  BitVector null{0, 1, 0, 1, 1, 1, 1};
+  DenseNullOverlay overlay(&null);
+  auto chain = overlay.MakeChain(numeric.MakeChain());
+
+  auto make_tokens = []() {
+    return std::vector{
+        column::DataLayerChain::SortToken{0, 0},
+        column::DataLayerChain::SortToken{1, 1},
+        column::DataLayerChain::SortToken{2, 2},
+        column::DataLayerChain::SortToken{3, 3},
+        column::DataLayerChain::SortToken{4, 4},
+        column::DataLayerChain::SortToken{5, 5},
+        column::DataLayerChain::SortToken{6, 6},
+    };
+  };
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kAscending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(0, 2, 4, 3, 5, 1, 6));
+  }
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kDescending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(6, 1, 5, 3, 4, 0, 2));
+  }
+}
+
 }  // namespace
-}  // namespace column
-}  // namespace trace_processor
-}  // namespace perfetto
+}  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/dummy_storage.cc b/src/trace_processor/db/column/dummy_storage.cc
index c82f767..54d7c61 100644
--- a/src/trace_processor/db/column/dummy_storage.cc
+++ b/src/trace_processor/db/column/dummy_storage.cc
@@ -17,7 +17,6 @@
 #include "src/trace_processor/db/column/dummy_storage.h"
 
 #include <cstdint>
-#include <memory>
 
 #include "perfetto/base/logging.h"
 #include "perfetto/trace_processor/basic_types.h"
@@ -26,8 +25,10 @@
 
 namespace perfetto::trace_processor::column {
 
-std::unique_ptr<DataLayerChain> DummyStorage::MakeChain() {
-  return std::make_unique<ChainImpl>();
+SingleSearchResult DummyStorage::ChainImpl::SingleSearch(FilterOp,
+                                                         SqlValue,
+                                                         uint32_t) const {
+  PERFETTO_FATAL("Shouldn't be called");
 }
 
 SearchValidationResult DummyStorage::ChainImpl::ValidateSearchConstraints(
@@ -54,11 +55,9 @@
   PERFETTO_FATAL("Shouldn't be called");
 }
 
-void DummyStorage::ChainImpl::StableSort(uint32_t*, uint32_t) const {
-  PERFETTO_FATAL("Shouldn't be called");
-}
-
-void DummyStorage::ChainImpl::Sort(uint32_t*, uint32_t) const {
+void DummyStorage::ChainImpl::StableSort(SortToken*,
+                                         SortToken*,
+                                         SortDirection) const {
   PERFETTO_FATAL("Shouldn't be called");
 }
 
diff --git a/src/trace_processor/db/column/dummy_storage.h b/src/trace_processor/db/column/dummy_storage.h
index a86cf6e..ced41a9 100644
--- a/src/trace_processor/db/column/dummy_storage.h
+++ b/src/trace_processor/db/column/dummy_storage.h
@@ -30,13 +30,14 @@
 // on them.
 class DummyStorage final : public DataLayer {
  public:
-  std::unique_ptr<DataLayerChain> MakeChain() override;
-
- private:
   class ChainImpl : public DataLayerChain {
    public:
     ChainImpl() = default;
 
+    SingleSearchResult SingleSearch(FilterOp,
+                                    SqlValue,
+                                    uint32_t) const override;
+
     SearchValidationResult ValidateSearchConstraints(FilterOp,
                                                      SqlValue) const override;
 
@@ -50,9 +51,9 @@
                                       SqlValue,
                                       Indices) const override;
 
-    void StableSort(uint32_t*, uint32_t) const override;
-
-    void Sort(uint32_t*, uint32_t) const override;
+    void StableSort(SortToken* start,
+                    SortToken* end,
+                    SortDirection) const override;
 
     void Serialize(StorageProto*) const override;
 
@@ -60,6 +61,7 @@
 
     std::string DebugString() const override { return "DummyStorage"; }
   };
+  std::unique_ptr<DataLayerChain> MakeChain();
 };
 
 }  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/fake_storage.cc b/src/trace_processor/db/column/fake_storage.cc
index 30ac3b8..9fbc3ae 100644
--- a/src/trace_processor/db/column/fake_storage.cc
+++ b/src/trace_processor/db/column/fake_storage.cc
@@ -19,7 +19,6 @@
 #include <algorithm>
 #include <cstdint>
 #include <iterator>
-#include <memory>
 #include <utility>
 
 #include "perfetto/base/logging.h"
@@ -30,32 +29,42 @@
 
 namespace perfetto::trace_processor::column {
 
-FakeStorage::FakeStorage(uint32_t size, SearchStrategy strategy)
-    : size_(size), strategy_(strategy) {}
-
-std::unique_ptr<DataLayerChain> FakeStorage::MakeChain() {
-  return std::make_unique<ChainImpl>(size_, strategy_, range_,
-                                     bit_vector_.Copy());
-}
-
-FakeStorage::ChainImpl::ChainImpl(uint32_t size,
-                                  SearchStrategy strategy,
-                                  Range range,
-                                  BitVector bv)
+FakeStorageChain::FakeStorageChain(uint32_t size,
+                                   SearchStrategy strategy,
+                                   Range range,
+                                   BitVector bv)
     : size_(size),
       strategy_(strategy),
       range_(range),
       bit_vector_(std::move(bv)) {}
 
-SearchValidationResult FakeStorage::ChainImpl::ValidateSearchConstraints(
+SingleSearchResult FakeStorageChain::SingleSearch(FilterOp,
+                                                  SqlValue,
+                                                  uint32_t i) const {
+  switch (strategy_) {
+    case kAll:
+      return SingleSearchResult::kMatch;
+    case kNone:
+      return SingleSearchResult::kNoMatch;
+    case kBitVector:
+      return bit_vector_.IsSet(i) ? SingleSearchResult::kMatch
+                                  : SingleSearchResult::kNoMatch;
+    case kRange:
+      return range_.Contains(i) ? SingleSearchResult::kMatch
+                                : SingleSearchResult::kNoMatch;
+  }
+  PERFETTO_FATAL("For GCC");
+}
+
+SearchValidationResult FakeStorageChain::ValidateSearchConstraints(
     FilterOp,
     SqlValue) const {
   return SearchValidationResult::kOk;
 }
 
-RangeOrBitVector FakeStorage::ChainImpl::SearchValidated(FilterOp,
-                                                         SqlValue,
-                                                         Range in) const {
+RangeOrBitVector FakeStorageChain::SearchValidated(FilterOp,
+                                                   SqlValue,
+                                                   Range in) const {
   switch (strategy_) {
     case kAll:
       return RangeOrBitVector(in);
@@ -73,10 +82,9 @@
   PERFETTO_FATAL("For GCC");
 }
 
-RangeOrBitVector FakeStorage::ChainImpl::IndexSearchValidated(
-    FilterOp,
-    SqlValue,
-    Indices indices) const {
+RangeOrBitVector FakeStorageChain::IndexSearchValidated(FilterOp,
+                                                        SqlValue,
+                                                        Indices indices) const {
   switch (strategy_) {
     case kAll:
       return RangeOrBitVector(Range(0, indices.size));
@@ -97,10 +105,9 @@
   PERFETTO_FATAL("For GCC");
 }
 
-Range FakeStorage::ChainImpl::OrderedIndexSearchValidated(
-    FilterOp,
-    SqlValue,
-    Indices indices) const {
+Range FakeStorageChain::OrderedIndexSearchValidated(FilterOp,
+                                                    SqlValue,
+                                                    Indices indices) const {
   if (strategy_ == kAll) {
     return {0, indices.size};
   }
@@ -134,17 +141,11 @@
           static_cast<uint32_t>(std::distance(indices.data, first_non_set))};
 }
 
-void FakeStorage::ChainImpl::StableSort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
+void FakeStorageChain::StableSort(SortToken*, SortToken*, SortDirection) const {
   PERFETTO_FATAL("Not implemented");
 }
 
-void FakeStorage::ChainImpl::Sort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
-}
-
-void FakeStorage::ChainImpl::Serialize(StorageProto*) const {
+void FakeStorageChain::Serialize(StorageProto*) const {
   // FakeStorage doesn't really make sense to serialize.
   PERFETTO_FATAL("Not implemented");
 }
diff --git a/src/trace_processor/db/column/fake_storage.h b/src/trace_processor/db/column/fake_storage.h
index 6cd124a..aca6890 100644
--- a/src/trace_processor/db/column/fake_storage.h
+++ b/src/trace_processor/db/column/fake_storage.h
@@ -30,86 +30,78 @@
 
 namespace perfetto::trace_processor::column {
 
-// Fake implementation of Storage for use in tests.
-class FakeStorage final : public DataLayer {
+// Fake implementation of DataLayerChain which can be used in unittests.
+class FakeStorageChain : public DataLayerChain {
  public:
-  std::unique_ptr<DataLayerChain> MakeChain() override;
-
-  static std::unique_ptr<DataLayer> SearchAll(uint32_t size) {
-    return std::unique_ptr<DataLayer>(
-        new FakeStorage(size, SearchStrategy::kAll));
+  // Factory function for creating a DataLayerChain which matches all rows from
+  // [0, size).
+  static std::unique_ptr<DataLayerChain> SearchAll(uint32_t size) {
+    return std::unique_ptr<DataLayerChain>(
+        new FakeStorageChain(size, SearchStrategy::kAll, Range(), BitVector()));
   }
 
-  static std::unique_ptr<DataLayer> SearchNone(uint32_t size) {
-    return std::unique_ptr<DataLayer>(
-        new FakeStorage(size, SearchStrategy::kNone));
+  // Factory function for creating a DataLayerChain which matches zero rows.
+  static std::unique_ptr<DataLayerChain> SearchNone(uint32_t size) {
+    return std::unique_ptr<DataLayerChain>(new FakeStorageChain(
+        size, SearchStrategy::kNone, Range(), BitVector()));
   }
 
-  static std::unique_ptr<DataLayer> SearchSubset(uint32_t size, Range r) {
-    std::unique_ptr<FakeStorage> storage(
-        new FakeStorage(size, SearchStrategy::kRange));
-    storage->range_ = r;
-    return std::move(storage);
+  // Factory function for creating a DataLayerChain which matches rows [r.start,
+  // r.end).
+  static std::unique_ptr<DataLayerChain> SearchSubset(uint32_t size, Range r) {
+    return std::unique_ptr<DataLayerChain>(
+        new FakeStorageChain(size, SearchStrategy::kRange, r, BitVector()));
   }
 
-  static std::unique_ptr<DataLayer> SearchSubset(uint32_t size, BitVector bv) {
-    std::unique_ptr<FakeStorage> storage(
-        new FakeStorage(size, SearchStrategy::kBitVector));
-    storage->bit_vector_ = std::move(bv);
-    return std::move(storage);
+  // Factory function for creating a DataLayerChain which matches rows of the
+  // set bit positions of |bv|.
+  static std::unique_ptr<DataLayerChain> SearchSubset(uint32_t size,
+                                                      BitVector bv) {
+    return std::unique_ptr<DataLayerChain>(new FakeStorageChain(
+        size, SearchStrategy::kBitVector, Range(), std::move(bv)));
   }
 
-  static std::unique_ptr<DataLayer> SearchSubset(
+  // Factory function for creating a DataLayerChain which matches rows specified
+  // by |index_vec|.
+  static std::unique_ptr<DataLayerChain> SearchSubset(
       uint32_t size,
       const std::vector<uint32_t>& index_vec) {
-    std::unique_ptr<FakeStorage> storage(
-        new FakeStorage(size, SearchStrategy::kBitVector));
     BitVector bv(size);
-    for (const uint32_t& i : index_vec) {
+    for (uint32_t i : index_vec) {
       bv.Set(i);
     }
-    storage->bit_vector_ = std::move(bv);
-    return std::move(storage);
+    return std::unique_ptr<DataLayerChain>(new FakeStorageChain(
+        size, SearchStrategy::kBitVector, Range(), std::move(bv)));
   }
 
+  // Implementation of DataLayerChain.
+  SingleSearchResult SingleSearch(FilterOp, SqlValue, uint32_t) const override;
+
+  SearchValidationResult ValidateSearchConstraints(FilterOp,
+                                                   SqlValue) const override;
+
+  RangeOrBitVector SearchValidated(FilterOp, SqlValue, Range) const override;
+
+  RangeOrBitVector IndexSearchValidated(FilterOp,
+                                        SqlValue,
+                                        Indices) const override;
+
+  Range OrderedIndexSearchValidated(FilterOp, SqlValue, Indices) const override;
+
+  void StableSort(SortToken* start,
+                  SortToken* end,
+                  SortDirection) const override;
+
+  void Serialize(StorageProto*) const override;
+
+  uint32_t size() const override { return size_; }
+
+  std::string DebugString() const override { return "FakeStorage"; }
+
  private:
   enum SearchStrategy { kNone, kAll, kRange, kBitVector };
 
-  class ChainImpl : public DataLayerChain {
-   public:
-    ChainImpl(uint32_t, SearchStrategy, Range, BitVector);
-
-    SearchValidationResult ValidateSearchConstraints(FilterOp,
-                                                     SqlValue) const override;
-
-    RangeOrBitVector SearchValidated(FilterOp, SqlValue, Range) const override;
-
-    RangeOrBitVector IndexSearchValidated(FilterOp,
-                                          SqlValue,
-                                          Indices) const override;
-
-    Range OrderedIndexSearchValidated(FilterOp,
-                                      SqlValue,
-                                      Indices) const override;
-
-    void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
-    void Sort(uint32_t* rows, uint32_t rows_size) const override;
-
-    void Serialize(StorageProto*) const override;
-
-    uint32_t size() const override { return size_; }
-
-    std::string DebugString() const override { return "FakeStorage"; }
-
-   private:
-    uint32_t size_ = 0;
-    SearchStrategy strategy_ = SearchStrategy::kNone;
-    Range range_;
-    BitVector bit_vector_;
-  };
-
-  FakeStorage(uint32_t size, SearchStrategy strategy);
+  FakeStorageChain(uint32_t, SearchStrategy, Range, BitVector);
 
   uint32_t size_ = 0;
   SearchStrategy strategy_ = SearchStrategy::kNone;
diff --git a/src/trace_processor/db/column/id_storage.cc b/src/trace_processor/db/column/id_storage.cc
index 948ca12..6fdb800 100644
--- a/src/trace_processor/db/column/id_storage.cc
+++ b/src/trace_processor/db/column/id_storage.cc
@@ -38,7 +38,6 @@
 #include "protos/perfetto/trace_processor/serialization.pbzero.h"
 
 namespace perfetto::trace_processor::column {
-
 namespace {
 
 template <typename Comparator>
@@ -152,8 +151,44 @@
   return SearchValidationResult::kOk;
 }
 
-std::unique_ptr<DataLayerChain> IdStorage::MakeChain() {
-  return std::make_unique<ChainImpl>();
+SingleSearchResult IdStorage::ChainImpl::SingleSearch(FilterOp op,
+                                                      SqlValue sql_val,
+                                                      uint32_t index) const {
+  if (sql_val.type != SqlValue::kLong ||
+      sql_val.long_value > std::numeric_limits<uint32_t>::max() ||
+      sql_val.long_value < std::numeric_limits<uint32_t>::min()) {
+    // Because of the large amount of code needing for handling comparisions
+    // with doubles or out of range values, just defer to the full search.
+    return SingleSearchResult::kNeedsFullSearch;
+  }
+  auto val = static_cast<uint32_t>(sql_val.long_value);
+  switch (op) {
+    case FilterOp::kEq:
+      return index == val ? SingleSearchResult::kMatch
+                          : SingleSearchResult::kNoMatch;
+    case FilterOp::kNe:
+      return index != val ? SingleSearchResult::kMatch
+                          : SingleSearchResult::kNoMatch;
+    case FilterOp::kGe:
+      return index >= val ? SingleSearchResult::kMatch
+                          : SingleSearchResult::kNoMatch;
+    case FilterOp::kGt:
+      return index > val ? SingleSearchResult::kMatch
+                         : SingleSearchResult::kNoMatch;
+    case FilterOp::kLe:
+      return index <= val ? SingleSearchResult::kMatch
+                          : SingleSearchResult::kNoMatch;
+    case FilterOp::kLt:
+      return index < val ? SingleSearchResult::kMatch
+                         : SingleSearchResult::kNoMatch;
+    case FilterOp::kIsNotNull:
+      return SingleSearchResult::kMatch;
+    case FilterOp::kIsNull:
+    case FilterOp::kGlob:
+    case FilterOp::kRegex:
+      return SingleSearchResult::kNoMatch;
+  }
+  PERFETTO_FATAL("For GCC");
 }
 
 RangeOrBitVector IdStorage::ChainImpl::SearchValidated(
@@ -309,15 +344,22 @@
   PERFETTO_FATAL("FilterOp not matched");
 }
 
-void IdStorage::ChainImpl::StableSort(uint32_t* indices,
-                                      uint32_t indices_size) const {
-  // We can use sort, as |indices| will not have duplicates.
-  Sort(indices, indices_size);
-}
-
-void IdStorage::ChainImpl::Sort(uint32_t* indices,
-                                uint32_t indices_size) const {
-  std::sort(indices, indices + indices_size);
+void IdStorage::ChainImpl::StableSort(SortToken* start,
+                                      SortToken* end,
+                                      SortDirection direction) const {
+  switch (direction) {
+    case SortDirection::kAscending:
+      std::stable_sort(start, end, [](const SortToken& a, const SortToken& b) {
+        return a.index < b.index;
+      });
+      return;
+    case SortDirection::kDescending:
+      std::stable_sort(start, end, [](const SortToken& a, const SortToken& b) {
+        return a.index > b.index;
+      });
+      return;
+  }
+  PERFETTO_FATAL("For GCC");
 }
 
 void IdStorage::ChainImpl::Serialize(StorageProto* storage) const {
diff --git a/src/trace_processor/db/column/id_storage.h b/src/trace_processor/db/column/id_storage.h
index 56115a9..e6e25ab 100644
--- a/src/trace_processor/db/column/id_storage.h
+++ b/src/trace_processor/db/column/id_storage.h
@@ -36,11 +36,18 @@
 // included in the column.
 class IdStorage final : public DataLayer {
  public:
-  std::unique_ptr<DataLayerChain> MakeChain() override;
+  IdStorage();
+  ~IdStorage() override;
+
+  std::unique_ptr<DataLayerChain> MakeChain();
 
  private:
   class ChainImpl : public DataLayerChain {
    public:
+    SingleSearchResult SingleSearch(FilterOp,
+                                    SqlValue,
+                                    uint32_t) const override;
+
     SearchValidationResult ValidateSearchConstraints(FilterOp,
                                                      SqlValue) const override;
 
@@ -54,9 +61,9 @@
                                       SqlValue,
                                       Indices) const override;
 
-    void StableSort(uint32_t*, uint32_t) const override;
-
-    void Sort(uint32_t*, uint32_t) const override;
+    void StableSort(SortToken* start,
+                    SortToken* end,
+                    SortDirection) const override;
 
     void Serialize(StorageProto*) const override;
 
diff --git a/src/trace_processor/db/column/id_storage_unittest.cc b/src/trace_processor/db/column/id_storage_unittest.cc
index 7b94cc0..48ce18e 100644
--- a/src/trace_processor/db/column/id_storage_unittest.cc
+++ b/src/trace_processor/db/column/id_storage_unittest.cc
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 #include "src/trace_processor/db/column/id_storage.h"
+
 #include <cstdint>
 #include <limits>
 #include <vector>
@@ -25,8 +26,7 @@
 #include "src/trace_processor/db/column/utils.h"
 #include "test/gtest_and_gmock.h"
 
-namespace perfetto {
-namespace trace_processor {
+namespace perfetto::trace_processor {
 
 inline bool operator==(const Range& a, const Range& b) {
   return std::tie(a.start, a.end) == std::tie(b.start, b.end);
@@ -103,6 +103,48 @@
             SearchValidationResult::kNoData);
 }
 
+TEST(IdStorage, SinglSearch) {
+  IdStorage storage;
+  auto chain = storage.MakeChain();
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(5), 5),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(5), 3),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(5), 3),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(5), 5),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(5), 5),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(5), 6),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(5), 4),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(5), 6),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(5), 5),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(5), 4),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(5), 6),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(5), 4),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Double(5), 4),
+            SingleSearchResult::kNeedsFullSearch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::String(""), 4),
+            SingleSearchResult::kNeedsFullSearch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGlob, SqlValue::Long(5), 4),
+            SingleSearchResult::kNoMatch);
+}
+
 TEST(IdStorage, SearchEqSimple) {
   IdStorage storage;
   auto chain = storage.MakeChain();
@@ -310,17 +352,27 @@
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(16, 17, 18, 19));
 }
 
-TEST(IdStorage, Sort) {
-  std::vector<uint32_t> order{4, 3, 6, 1, 5};
+TEST(IdStorage, StableSort) {
   IdStorage storage;
   auto chain = storage.MakeChain();
-  chain->Sort(order.data(), 5);
+  std::vector tokens{
+      column::DataLayerChain::SortToken{0, 0},
+      column::DataLayerChain::SortToken{1, 1},
+      column::DataLayerChain::SortToken{2, 2},
+      column::DataLayerChain::SortToken{3, 3},
+      column::DataLayerChain::SortToken{4, 4},
+  };
+  chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                    column::DataLayerChain::SortDirection::kAscending);
+  ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+              ElementsAre(0, 1, 2, 3, 4));
 
-  std::vector<uint32_t> sorted_order{1, 3, 4, 5, 6};
-  ASSERT_EQ(order, sorted_order);
+  chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                    column::DataLayerChain::SortDirection::kDescending);
+  ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+              ElementsAre(4, 3, 2, 1, 0));
 }
 
 }  // namespace
 }  // namespace column
-}  // namespace trace_processor
-}  // namespace perfetto
+}  // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/column/null_overlay.cc b/src/trace_processor/db/column/null_overlay.cc
index 2d27f63..af31ac5 100644
--- a/src/trace_processor/db/column/null_overlay.cc
+++ b/src/trace_processor/db/column/null_overlay.cc
@@ -78,11 +78,30 @@
 
 }  // namespace
 
-NullOverlay::NullOverlay(const BitVector* non_null) : non_null_(non_null) {}
-
-std::unique_ptr<DataLayerChain> NullOverlay::MakeChain(
-    std::unique_ptr<DataLayerChain> inner) {
-  return std::make_unique<ChainImpl>(std::move(inner), non_null_);
+SingleSearchResult NullOverlay::ChainImpl::SingleSearch(FilterOp op,
+                                                        SqlValue sql_val,
+                                                        uint32_t index) const {
+  switch (op) {
+    case FilterOp::kIsNull:
+      return non_null_->IsSet(index)
+                 ? inner_->SingleSearch(op, sql_val,
+                                        non_null_->CountSetBits(index))
+                 : SingleSearchResult::kMatch;
+    case FilterOp::kIsNotNull:
+    case FilterOp::kEq:
+    case FilterOp::kGe:
+    case FilterOp::kGt:
+    case FilterOp::kLt:
+    case FilterOp::kLe:
+    case FilterOp::kNe:
+    case FilterOp::kGlob:
+    case FilterOp::kRegex:
+      return non_null_->IsSet(index)
+                 ? inner_->SingleSearch(op, sql_val,
+                                        non_null_->CountSetBits(index))
+                 : SingleSearchResult::kNoMatch;
+  }
+  PERFETTO_FATAL("For GCC");
 }
 
 NullOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> innner,
@@ -97,7 +116,6 @@
   if (op == FilterOp::kIsNull) {
     return SearchValidationResult::kOk;
   }
-
   return inner_->ValidateSearchConstraints(op, sql_val);
 }
 
@@ -233,14 +251,19 @@
           inner_range.end + non_null_offset};
 }
 
-void NullOverlay::ChainImpl::StableSort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
-}
-
-void NullOverlay::ChainImpl::Sort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
+void NullOverlay::ChainImpl::StableSort(SortToken* start,
+                                        SortToken* end,
+                                        SortDirection direction) const {
+  SortToken* middle = std::stable_partition(
+      start, end,
+      [this](const SortToken& idx) { return !non_null_->IsSet(idx.index); });
+  for (SortToken* it = middle; it != end; ++it) {
+    it->index = non_null_->CountSetBits(it->index);
+  }
+  inner_->StableSort(middle, end, direction);
+  if (direction == SortDirection::kDescending) {
+    std::rotate(start, middle, end);
+  }
 }
 
 void NullOverlay::ChainImpl::Serialize(StorageProto* storage) const {
diff --git a/src/trace_processor/db/column/null_overlay.h b/src/trace_processor/db/column/null_overlay.h
index 263d0f7..99f6256 100644
--- a/src/trace_processor/db/column/null_overlay.h
+++ b/src/trace_processor/db/column/null_overlay.h
@@ -33,15 +33,21 @@
 class NullOverlay final : public DataLayer {
  public:
   explicit NullOverlay(const BitVector* non_null);
+  ~NullOverlay() override;
 
   std::unique_ptr<DataLayerChain> MakeChain(
-      std::unique_ptr<DataLayerChain>) override;
+      std::unique_ptr<DataLayerChain>,
+      ChainCreationArgs = ChainCreationArgs());
 
  private:
   class ChainImpl : public DataLayerChain {
    public:
     ChainImpl(std::unique_ptr<DataLayerChain>, const BitVector* non_null);
 
+    SingleSearchResult SingleSearch(FilterOp,
+                                    SqlValue,
+                                    uint32_t) const override;
+
     SearchValidationResult ValidateSearchConstraints(FilterOp,
                                                      SqlValue) const override;
 
@@ -55,9 +61,9 @@
                                       SqlValue,
                                       Indices) const override;
 
-    void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
-    void Sort(uint32_t* rows, uint32_t rows_size) const override;
+    void StableSort(SortToken* start,
+                    SortToken* end,
+                    SortDirection) const override;
 
     void Serialize(StorageProto*) const override;
 
diff --git a/src/trace_processor/db/column/null_overlay_unittest.cc b/src/trace_processor/db/column/null_overlay_unittest.cc
index 41d1e5a..ceb6c9f 100644
--- a/src/trace_processor/db/column/null_overlay_unittest.cc
+++ b/src/trace_processor/db/column/null_overlay_unittest.cc
@@ -22,7 +22,9 @@
 
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/db/column/data_layer.h"
 #include "src/trace_processor/db/column/fake_storage.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column/utils.h"
 #include "test/gtest_and_gmock.h"
@@ -33,11 +35,49 @@
 using testing::ElementsAre;
 using testing::IsEmpty;
 
+TEST(NullOverlay, SingleSearch) {
+  BitVector bv{0, 1, 0, 1, 1, 1};
+  auto fake = FakeStorageChain::SearchSubset(4, std::vector<uint32_t>{1, 2});
+  NullOverlay storage(&bv);
+  auto chain = storage.MakeChain(std::move(fake));
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 3),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 1),
+            SingleSearchResult::kNoMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 2),
+            SingleSearchResult::kNoMatch);
+}
+
+TEST(NullOverlay, SingleSearchIsNull) {
+  BitVector bv{0, 1, 0, 1, 1, 1};
+  auto fake = FakeStorageChain::SearchNone(4);
+  NullOverlay storage(&bv);
+  auto chain = storage.MakeChain(std::move(fake));
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 0),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 1),
+            SingleSearchResult::kNoMatch);
+}
+
+TEST(NullOverlay, SingleSearchIsNotNull) {
+  BitVector bv{0, 1, 0, 1, 1, 1};
+  auto fake = FakeStorageChain::SearchAll(4);
+  NullOverlay storage(&bv);
+  auto chain = storage.MakeChain(std::move(fake));
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 1),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 0),
+            SingleSearchResult::kNoMatch);
+}
+
 TEST(NullOverlay, SearchInputInsideBoundary) {
   BitVector bv{0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0};
-  auto fake = FakeStorage::SearchAll(4u);
+  auto fake = FakeStorageChain::SearchAll(4u);
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGt, SqlValue::Long(0), Range(1, 6));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3, 4));
@@ -45,9 +85,9 @@
 
 TEST(NullOverlay, SearchInputOutsideBoundary) {
   BitVector bv{0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0};
-  auto fake = FakeStorage::SearchAll(5u);
+  auto fake = FakeStorageChain::SearchAll(5u);
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGt, SqlValue::Long(0), Range(3, 8));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3, 4, 7));
@@ -55,9 +95,9 @@
 
 TEST(NullOverlay, SubsetResultOutsideBoundary) {
   BitVector bv{0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0};
-  auto fake = FakeStorage::SearchSubset(5u, Range(1, 3));
+  auto fake = FakeStorageChain::SearchSubset(5u, Range(1, 3));
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGt, SqlValue::Long(0), Range(0, 11));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3, 4));
@@ -65,9 +105,9 @@
 
 TEST(NullOverlay, SubsetResultOnBoundary) {
   BitVector bv{0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0};
-  auto fake = FakeStorage::SearchAll(5u);
+  auto fake = FakeStorageChain::SearchAll(5u);
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGt, SqlValue::Long(0), Range(0, 11));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1, 3, 4, 7, 8));
@@ -75,9 +115,9 @@
 
 TEST(NullOverlay, BitVectorSubset) {
   BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
-  auto fake = FakeStorage::SearchSubset(4u, BitVector{0, 1, 0, 1});
+  auto fake = FakeStorageChain::SearchSubset(4u, BitVector{0, 1, 0, 1});
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGt, SqlValue::Long(0), Range(0, 8));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 6));
@@ -85,9 +125,9 @@
 
 TEST(NullOverlay, BitVectorSubsetIsNull) {
   BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
-  auto fake = FakeStorage::SearchSubset(4u, BitVector{0, 1, 0, 1});
+  auto fake = FakeStorageChain::SearchSubset(4u, BitVector{0, 1, 0, 1});
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kIsNull, SqlValue(), Range(0, 8));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 2, 3, 4, 6, 7));
@@ -95,9 +135,9 @@
 
 TEST(NullOverlay, IndexSearchAllElements) {
   BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
-  auto fake = FakeStorage::SearchAll(4u);
+  auto fake = FakeStorageChain::SearchAll(4u);
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> table_idx{1, 5, 2};
   auto res =
@@ -109,9 +149,9 @@
 
 TEST(NullOverlay, IndexSearchPartialElements) {
   BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
-  auto fake = FakeStorage::SearchAll(4u);
+  auto fake = FakeStorageChain::SearchAll(4u);
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> table_idx{1, 4, 2};
   auto res =
@@ -123,9 +163,9 @@
 
 TEST(NullOverlay, IndexSearchIsNullOpEmptyRes) {
   BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
-  auto fake = FakeStorage::SearchNone(4u);
+  auto fake = FakeStorageChain::SearchNone(4u);
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> table_idx{0, 3, 5, 4, 2};
   auto res =
@@ -137,9 +177,9 @@
 
 TEST(NullOverlay, IndexSearchIsNullOp) {
   BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
-  auto fake = FakeStorage::SearchSubset(4u, Range(2, 3));
+  auto fake = FakeStorageChain::SearchSubset(4u, Range(2, 3));
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> table_idx{0, 3, 2, 4, 5};
   auto res =
@@ -151,9 +191,9 @@
 
 TEST(NullOverlay, IndexSearchIsNotNullOp) {
   BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
-  auto fake = FakeStorage::SearchAll(4u);
+  auto fake = FakeStorageChain::SearchAll(4u);
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> table_idx{0, 3, 4};
   auto res =
@@ -167,9 +207,9 @@
   BitVector bv{0, 1, 1, 1, 0, 1};
   // Passing values in final storage (on normal operations)
   // 0, 1, 0, 1, 0, 0
-  auto fake = FakeStorage::SearchSubset(4, BitVector{1, 0, 1, 0});
+  auto fake = FakeStorageChain::SearchSubset(4, BitVector{1, 0, 1, 0});
   NullOverlay storage(&bv);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   // Passing values on final data
   // NULL, NULL, 0, 1, 1
@@ -206,5 +246,40 @@
   ASSERT_EQ(res.end, 5u);
 }
 
+TEST(NullOverlay, StableSort) {
+  std::vector<uint32_t> numeric_data{3, 1, 0, 2, 4};
+  NumericStorage<uint32_t> numeric(&numeric_data, ColumnType::kUint32, false);
+
+  BitVector null{0, 1, 0, 1, 1, 1, 1};
+  NullOverlay overlay(&null);
+  auto chain = overlay.MakeChain(numeric.MakeChain());
+
+  auto make_tokens = []() {
+    return std::vector{
+        column::DataLayerChain::SortToken{0, 0},
+        column::DataLayerChain::SortToken{1, 1},
+        column::DataLayerChain::SortToken{2, 2},
+        column::DataLayerChain::SortToken{3, 3},
+        column::DataLayerChain::SortToken{4, 4},
+        column::DataLayerChain::SortToken{5, 5},
+        column::DataLayerChain::SortToken{6, 6},
+    };
+  };
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kAscending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(0, 2, 4, 3, 5, 1, 6));
+  }
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kDescending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(6, 1, 5, 3, 4, 0, 2));
+  }
+}
+
 }  // namespace
 }  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/numeric_storage.cc b/src/trace_processor/db/column/numeric_storage.cc
index ca73ea1..529e93d 100644
--- a/src/trace_processor/db/column/numeric_storage.cc
+++ b/src/trace_processor/db/column/numeric_storage.cc
@@ -22,11 +22,11 @@
 #include <cstdint>
 #include <functional>
 #include <limits>
+#include <memory>
 #include <optional>
 #include <string>
 #include <utility>
 #include <variant>
-#include <vector>
 
 #include "perfetto/base/logging.h"
 #include "perfetto/public/compiler.h"
@@ -293,11 +293,6 @@
 
 }  // namespace
 
-NumericStorageBase::NumericStorageBase(ColumnType type, bool is_sorted)
-    : storage_type_(type), is_sorted_(is_sorted) {}
-
-NumericStorageBase::~NumericStorageBase() = default;
-
 NumericStorageBase::ChainImpl::ChainImpl(const void* vector_ptr,
                                          ColumnType type,
                                          bool is_sorted)
@@ -357,9 +352,9 @@
   enum ExtremeVal { kTooBig, kTooSmall, kOk };
   ExtremeVal extreme_validator = kOk;
 
-  double_t num_val = val.type == SqlValue::kLong
-                         ? static_cast<double_t>(val.AsLong())
-                         : val.AsDouble();
+  double num_val = val.type == SqlValue::kLong
+                       ? static_cast<double>(val.AsLong())
+                       : val.AsDouble();
 
   switch (storage_type_) {
     case ColumnType::kDouble:
@@ -638,10 +633,9 @@
     case FilterOp::kEq:
       return {LowerBoundIntrinsic(vector_ptr_, val, search_range),
               UpperBoundIntrinsic(vector_ptr_, val, search_range)};
-    case FilterOp::kLe: {
+    case FilterOp::kLe:
       return {search_range.start,
               UpperBoundIntrinsic(vector_ptr_, val, search_range)};
-    }
     case FilterOp::kLt:
       return {search_range.start,
               LowerBoundIntrinsic(vector_ptr_, val, search_range)};
@@ -661,28 +655,6 @@
   return {};
 }
 
-void NumericStorageBase::ChainImpl::StableSort(uint32_t* rows,
-                                               uint32_t rows_size) const {
-  std::visit(
-      [this, &rows, rows_size](auto val_data) {
-        using T = decltype(val_data);
-        const T* typed_start =
-            static_cast<const std::vector<T>*>(vector_ptr_)->data();
-        std::stable_sort(rows, rows + rows_size,
-                         [typed_start](uint32_t a_idx, uint32_t b_idx) {
-                           T first_val = typed_start[a_idx];
-                           T second_val = typed_start[b_idx];
-                           return first_val < second_val;
-                         });
-      },
-      GetNumericTypeVariant(storage_type_, SqlValue::Long(0)));
-}
-
-void NumericStorageBase::ChainImpl::Sort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_ELOG("Not implemented");
-}
-
 void NumericStorageBase::ChainImpl::Serialize(StorageProto* msg) const {
   auto* numeric_storage_msg = msg->set_numeric_storage();
   numeric_storage_msg->set_is_sorted(is_sorted_);
diff --git a/src/trace_processor/db/column/numeric_storage.h b/src/trace_processor/db/column/numeric_storage.h
index 63d20ee..2dfafc6 100644
--- a/src/trace_processor/db/column/numeric_storage.h
+++ b/src/trace_processor/db/column/numeric_storage.h
@@ -17,15 +17,18 @@
 #define SRC_TRACE_PROCESSOR_DB_COLUMN_NUMERIC_STORAGE_H_
 
 #include <cstdint>
+#include <limits>
 #include <memory>
 #include <string>
 #include <variant>
 #include <vector>
 
+#include "perfetto/base/compiler.h"
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/containers/bit_vector.h"
 #include "src/trace_processor/db/column/data_layer.h"
 #include "src/trace_processor/db/column/types.h"
+#include "src/trace_processor/db/column/utils.h"
 
 namespace perfetto::trace_processor::column {
 
@@ -47,10 +50,6 @@
                                       SqlValue,
                                       Indices) const override;
 
-    void StableSort(uint32_t*, uint32_t) const override;
-
-    void Sort(uint32_t*, uint32_t) const override;
-
     void Serialize(StorageProto*) const override;
 
     std::string DebugString() const override { return "NumericStorage"; }
@@ -78,7 +77,7 @@
     const bool is_sorted_ = false;
   };
 
-  NumericStorageBase(ColumnType type, bool is_sorted);
+  NumericStorageBase(ColumnType type, bool is_sorted, Impl impl);
   ~NumericStorageBase() override;
 
   const ColumnType storage_type_ = ColumnType::kDummy;
@@ -89,14 +88,14 @@
 template <typename T>
 class NumericStorage final : public NumericStorageBase {
  public:
-  NumericStorage(const std::vector<T>* vec,
-                 ColumnType type,
-                 bool is_sorted = false)
-      : NumericStorageBase(type, is_sorted), vector_(vec) {}
+  PERFETTO_NO_INLINE NumericStorage(const std::vector<T>* vec,
+                                    ColumnType type,
+                                    bool is_sorted);
 
-  std::unique_ptr<DataLayerChain> MakeChain() override {
-    return std::make_unique<ChainImpl>(vector_, storage_type_, is_sorted_);
-  }
+  // The implementation of this function is given by
+  // make_chain.cc/make_chain_minimal.cc depending on whether this is a minimal
+  // or full build of trace processor.
+  std::unique_ptr<DataLayerChain> MakeChain();
 
  private:
   class ChainImpl : public NumericStorageBase::ChainImpl {
@@ -105,6 +104,46 @@
         : NumericStorageBase::ChainImpl(vector, type, is_sorted),
           vector_(vector) {}
 
+    SingleSearchResult SingleSearch(FilterOp op,
+                                    SqlValue sql_val,
+                                    uint32_t i) const override {
+      if constexpr (std::is_same_v<T, double>) {
+        if (sql_val.type != SqlValue::kDouble) {
+          return SingleSearchResult::kNeedsFullSearch;
+        }
+        return utils::SingleSearchNumeric(op, (*vector_)[i],
+                                          sql_val.double_value);
+      } else {
+        if (sql_val.type != SqlValue::kLong ||
+            sql_val.long_value > std::numeric_limits<T>::max() ||
+            sql_val.long_value < std::numeric_limits<T>::min()) {
+          return SingleSearchResult::kNeedsFullSearch;
+        }
+        return utils::SingleSearchNumeric(op, (*vector_)[i],
+                                          static_cast<T>(sql_val.long_value));
+      }
+    }
+
+    void StableSort(SortToken* start,
+                    SortToken* end,
+                    SortDirection direction) const override {
+      const T* base = vector_->data();
+      switch (direction) {
+        case SortDirection::kAscending:
+          std::stable_sort(start, end,
+                           [base](const SortToken& a, const SortToken& b) {
+                             return base[a.index] < base[b.index];
+                           });
+          break;
+        case SortDirection::kDescending:
+          std::stable_sort(start, end,
+                           [base](const SortToken& a, const SortToken& b) {
+                             return base[a.index] > base[b.index];
+                           });
+          break;
+      }
+    }
+
     uint32_t size() const override {
       return static_cast<uint32_t>(vector_->size());
     }
@@ -112,10 +151,41 @@
    private:
     const std::vector<T>* vector_;
   };
+  Impl GetImpl() {
+    if constexpr (std::is_same_v<T, double>) {
+      return Impl::kNumericDouble;
+    } else if constexpr (std::is_same_v<T, uint32_t>) {
+      return Impl::kNumericUint32;
+    } else if constexpr (std::is_same_v<T, int32_t>) {
+      return Impl::kNumericInt32;
+    } else if constexpr (std::is_same_v<T, int64_t>) {
+      return Impl::kNumericInt64;
+    } else {
+      // false doesn't work as expression has to depend on the template
+      // parameter
+      static_assert(sizeof(T*) == 0, "T is not supported");
+    }
+  }
 
   const std::vector<T>* vector_;
 };
 
+// Define external templates to reduce binary size bloat.
+extern template class NumericStorage<double>;
+extern template class NumericStorage<uint32_t>;
+extern template class NumericStorage<int32_t>;
+extern template class NumericStorage<int64_t>;
+
+// Define external templates to allow splitting minimal vs full targets.
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<double>::MakeChain();
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<uint32_t>::MakeChain();
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<int32_t>::MakeChain();
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<int64_t>::MakeChain();
+
 }  // namespace perfetto::trace_processor::column
 
 #endif  // SRC_TRACE_PROCESSOR_DB_COLUMN_NUMERIC_STORAGE_H_
diff --git a/src/trace_processor/db/column/numeric_storage_unittest.cc b/src/trace_processor/db/column/numeric_storage_unittest.cc
index 256f57d..534338c 100644
--- a/src/trace_processor/db/column/numeric_storage_unittest.cc
+++ b/src/trace_processor/db/column/numeric_storage_unittest.cc
@@ -24,13 +24,13 @@
 
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/containers/row_map.h"
+#include "src/trace_processor/db/column/data_layer.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column/utils.h"
 #include "src/trace_processor/db/compare.h"
 #include "test/gtest_and_gmock.h"
 
-namespace perfetto {
-namespace trace_processor {
+namespace perfetto::trace_processor {
 
 inline bool operator==(const Range& a, const Range& b) {
   return std::tie(a.start, a.end) == std::tie(b.start, b.end);
@@ -45,7 +45,7 @@
 TEST(NumericStorage, InvalidSearchConstraintsGeneralChecks) {
   std::vector<uint32_t> data_vec(128);
   std::iota(data_vec.begin(), data_vec.end(), 0);
-  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
+  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32, false);
   auto chain = storage.MakeChain();
 
   Range test_range(20, 100);
@@ -75,7 +75,7 @@
 TEST(NumericStorage, InvalidValueBoundsUint32) {
   std::vector<uint32_t> data_vec(128);
   std::iota(data_vec.begin(), data_vec.end(), 0);
-  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
+  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32, false);
   auto chain = storage.MakeChain();
 
   SqlValue max_val = SqlValue::Long(
@@ -114,7 +114,7 @@
 TEST(NumericStorage, InvalidValueBoundsInt32) {
   std::vector<int32_t> data_vec(128);
   std::iota(data_vec.begin(), data_vec.end(), 0);
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
 
   SqlValue max_val = SqlValue::Long(
@@ -150,35 +150,45 @@
             SearchValidationResult::kNoData);
 }
 
-TEST(NumericStorage, StableSortTrivial) {
-  std::vector<uint32_t> data_vec{0, 1, 2, 0, 1, 2, 0, 1, 2};
-  std::vector<uint32_t> out = {0, 1, 2, 3, 4, 5, 6, 7, 8};
-
-  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
+TEST(NumericStorage, SingleSearch) {
+  std::vector<int32_t> data_vec{0, 1, 2, 3, 0, -1, -2, -3};
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
-  RowMap rm(0, 9);
-  chain->StableSort(out.data(), 9);
 
-  std::vector<uint32_t> stable_out{0, 3, 6, 1, 4, 7, 2, 5, 8};
-  ASSERT_EQ(out, stable_out);
-}
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(1), 1),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(1), 5),
+            SingleSearchResult::kNoMatch);
 
-TEST(NumericStorage, StableSort) {
-  std::vector<uint32_t> data_vec{0, 1, 2, 0, 1, 2, 0, 1, 2};
-  std::vector<uint32_t> out = {1, 7, 4, 0, 6, 3, 2, 5, 8};
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(1), 0),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(-2), 6),
+            SingleSearchResult::kNoMatch);
 
-  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
-  auto chain = storage.MakeChain();
-  RowMap rm(0, 9);
-  chain->StableSort(out.data(), 9);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(3), 2),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(-2), 5),
+            SingleSearchResult::kNoMatch);
 
-  std::vector<uint32_t> stable_out{0, 6, 3, 1, 7, 4, 2, 5, 8};
-  ASSERT_EQ(out, stable_out);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(4), 4),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(0), 3),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(0), 3),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(0), 5),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0), 0),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0), 5),
+            SingleSearchResult::kNoMatch);
 }
 
 TEST(NumericStorage, Search) {
   std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
   Range test_range(1, 5);
   SqlValue val = SqlValue::Long(4);
@@ -204,7 +214,7 @@
 
 TEST(NumericStorage, SearchCompareWithNegative) {
   std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
   Range test_range(1, 5);
   SqlValue val = SqlValue::Long(-3);
@@ -230,7 +240,7 @@
 
 TEST(NumericStorage, IndexSearch) {
   std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
 
   // -5, -3, -3, 3, 5, 0
@@ -259,7 +269,7 @@
 
 TEST(NumericStorage, IndexSearchCompareWithNegative) {
   std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
 
   // -5, -3, -3, 3, 5, 0
@@ -289,7 +299,7 @@
 TEST(NumericStorage, SearchFast) {
   std::vector<uint32_t> data_vec(128);
   std::iota(data_vec.begin(), data_vec.end(), 0);
-  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
+  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32, false);
   auto chain = storage.MakeChain();
   RangeOrBitVector range_or_bv =
       chain->Search(FilterOp::kGe, SqlValue::Long(100), Range(0, 128));
@@ -341,7 +351,7 @@
   Indices sorted_order{sorted_order_vec.data(), 10,
                        Indices::State::kNonmonotonic};
 
-  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
+  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32, false);
   auto chain = storage.MakeChain();
 
   Range range = chain->OrderedIndexSearch(FilterOp::kEq, SqlValue::Long(60),
@@ -377,7 +387,7 @@
 
 TEST(NumericStorage, SearchWithIntAsDouble) {
   std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
   Range test_range(1, 5);
   SqlValue val = SqlValue::Double(4);
@@ -403,7 +413,7 @@
 
 TEST(NumericStorage, IndexSearchWithIntAsDouble) {
   std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
 
   // -5, -3, -3, 3, 5, 0
@@ -432,7 +442,7 @@
 
 TEST(NumericStorage, SearchInt32WithDouble) {
   std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
   Range test_range(1, 5);
   SqlValue val = SqlValue::Double(3.5);
@@ -458,7 +468,7 @@
 
 TEST(NumericStorage, SearchInt32WithNegDouble) {
   std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
   Range test_range(1, 5);
   SqlValue val = SqlValue::Double(-3.5);
@@ -484,7 +494,7 @@
 
 TEST(NumericStorage, IndexSearchInt32WithDouble) {
   std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
 
   // -5, -3, -3, 3, 5, 0
@@ -513,7 +523,7 @@
 
 TEST(NumericStorage, IndexSearchInt32WithNegDouble) {
   std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
-  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
 
   // -5, -3, -3, 3, 5, 0
@@ -542,7 +552,7 @@
 
 TEST(NumericStorage, SearchUint32WithNegDouble) {
   std::vector<uint32_t> data_vec{0, 1, 2, 3, 4, 5};
-  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
   Range test_range(1, 5);
   SqlValue val = SqlValue::Double(-3.5);
@@ -568,7 +578,7 @@
 
 TEST(NumericStorage, IndexSearchUint32WithNegDouble) {
   std::vector<uint32_t> data_vec{0, 1, 2, 3, 4, 5, 6};
-  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kInt32);
+  NumericStorage<uint32_t> storage(&data_vec, ColumnType::kInt32, false);
   auto chain = storage.MakeChain();
 
   std::vector<uint32_t> indices_vec{0, 4, 4, 5, 1, 6};
@@ -607,7 +617,7 @@
   ASSERT_TRUE(compare::LongToDouble(not_rep_i, data_vec[0]) > 0);
   ASSERT_TRUE(compare::LongToDouble(not_rep_i, data_vec[1]) < 0);
 
-  NumericStorage<double> storage(&data_vec, ColumnType::kDouble);
+  NumericStorage<double> storage(&data_vec, ColumnType::kDouble, false);
   auto chain = storage.MakeChain();
   Range test_range(0, 2);
 
@@ -643,7 +653,7 @@
   ASSERT_TRUE(compare::LongToDouble(not_rep_i, data_vec[0]) < 0);
   ASSERT_TRUE(compare::LongToDouble(not_rep_i, data_vec[1]) > 0);
 
-  NumericStorage<double> storage(&data_vec, ColumnType::kDouble);
+  NumericStorage<double> storage(&data_vec, ColumnType::kDouble, false);
   auto chain = storage.MakeChain();
   Range test_range(0, 2);
 
@@ -666,7 +676,37 @@
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0));
 }
 
+TEST(NumericStorage, StableSort) {
+  std::vector<int64_t> data{
+      -1, -100, 2, 100, 2,
+  };
+  NumericStorage<int64_t> storage(&data, ColumnType::kInt64, false);
+  auto chain = storage.MakeChain();
+  auto make_tokens = []() {
+    return std::vector{
+        column::DataLayerChain::SortToken{0, 0},
+        column::DataLayerChain::SortToken{1, 1},
+        column::DataLayerChain::SortToken{2, 2},
+        column::DataLayerChain::SortToken{3, 3},
+        column::DataLayerChain::SortToken{4, 4},
+    };
+  };
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kAscending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(1, 0, 2, 4, 3));
+  }
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kDescending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(3, 2, 4, 0, 1));
+  }
+}
+
 }  // namespace
 }  // namespace column
-}  // namespace trace_processor
-}  // namespace perfetto
+}  // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/column/range_overlay.cc b/src/trace_processor/db/column/range_overlay.cc
index 6455174..0b8275b 100644
--- a/src/trace_processor/db/column/range_overlay.cc
+++ b/src/trace_processor/db/column/range_overlay.cc
@@ -34,19 +34,19 @@
 
 using Range = Range;
 
-RangeOverlay::RangeOverlay(const Range* range) : range_(range) {}
-
-std::unique_ptr<DataLayerChain> RangeOverlay::MakeChain(
-    std::unique_ptr<DataLayerChain> inner) {
-  return std::make_unique<ChainImpl>(std::move(inner), range_);
-}
-
 RangeOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> inner,
                                    const Range* range)
     : inner_(std::move(inner)), range_(range) {
   PERFETTO_CHECK(range->end <= inner_->size());
 }
 
+SingleSearchResult RangeOverlay::ChainImpl::SingleSearch(FilterOp op,
+                                                         SqlValue sql_val,
+                                                         uint32_t i) const {
+  PERFETTO_DCHECK(i < range_->size());
+  return inner_->SingleSearch(op, sql_val, i + range_->start);
+}
+
 SearchValidationResult RangeOverlay::ChainImpl::ValidateSearchConstraints(
     FilterOp op,
     SqlValue sql_val) const {
@@ -135,14 +135,13 @@
       op, sql_val, Indices{storage_iv.data(), indices.size, indices.state});
 }
 
-void RangeOverlay::ChainImpl::StableSort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
-}
-
-void RangeOverlay::ChainImpl::Sort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
+void RangeOverlay::ChainImpl::StableSort(SortToken* start,
+                                         SortToken* end,
+                                         SortDirection direction) const {
+  for (SortToken* it = start; it != end; ++it) {
+    it->index += range_->start;
+  }
+  inner_->StableSort(start, end, direction);
 }
 
 void RangeOverlay::ChainImpl::Serialize(StorageProto*) const {
diff --git a/src/trace_processor/db/column/range_overlay.h b/src/trace_processor/db/column/range_overlay.h
index 4ba5875..200d5d4 100644
--- a/src/trace_processor/db/column/range_overlay.h
+++ b/src/trace_processor/db/column/range_overlay.h
@@ -30,15 +30,21 @@
 class RangeOverlay final : public DataLayer {
  public:
   explicit RangeOverlay(const Range*);
+  ~RangeOverlay() override;
 
   std::unique_ptr<DataLayerChain> MakeChain(
-      std::unique_ptr<DataLayerChain>) override;
+      std::unique_ptr<DataLayerChain>,
+      ChainCreationArgs = ChainCreationArgs());
 
  private:
   class ChainImpl : public DataLayerChain {
    public:
     ChainImpl(std::unique_ptr<DataLayerChain>, const Range*);
 
+    SingleSearchResult SingleSearch(FilterOp,
+                                    SqlValue,
+                                    uint32_t) const override;
+
     SearchValidationResult ValidateSearchConstraints(FilterOp,
                                                      SqlValue) const override;
 
@@ -52,9 +58,9 @@
                                       SqlValue,
                                       Indices) const override;
 
-    void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
-    void Sort(uint32_t* rows, uint32_t rows_size) const override;
+    void StableSort(SortToken* start,
+                    SortToken* end,
+                    SortDirection) const override;
 
     void Serialize(StorageProto*) const override;
 
diff --git a/src/trace_processor/db/column/range_overlay_unittest.cc b/src/trace_processor/db/column/range_overlay_unittest.cc
index 74864e8..f4ec491 100644
--- a/src/trace_processor/db/column/range_overlay_unittest.cc
+++ b/src/trace_processor/db/column/range_overlay_unittest.cc
@@ -20,7 +20,10 @@
 #include <vector>
 
 #include "perfetto/trace_processor/basic_types.h"
+#include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/db/column/data_layer.h"
 #include "src/trace_processor/db/column/fake_storage.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column/utils.h"
 #include "test/gtest_and_gmock.h"
@@ -32,59 +35,92 @@
 using testing::IsEmpty;
 using Range = Range;
 
+TEST(SelectorOverlay, SearchSingle) {
+  Range range(3, 8);
+  RangeOverlay storage(&range);
+  auto fake = FakeStorageChain::SearchSubset(
+      8, BitVector{false, false, false, true, false, false, false, false});
+  auto chain = storage.MakeChain(std::move(fake));
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(0u), 0),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(0u), 1),
+            SingleSearchResult::kNoMatch);
+}
+
 TEST(RangeOverlay, SearchAll) {
   Range range(3, 8);
   RangeOverlay storage(&range);
-  auto fake = FakeStorage::SearchAll(10);
-  auto queryable = storage.MakeChain(fake->MakeChain());
+  auto fake = FakeStorageChain::SearchAll(10);
+  auto chain = storage.MakeChain(std::move(fake));
 
-  auto res = queryable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
+  auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1u, 2u, 3u));
 }
 
 TEST(RangeOverlay, SearchNone) {
   Range range(3, 8);
   RangeOverlay storage(&range);
-  auto fake = FakeStorage::SearchNone(10);
-  auto queryable = storage.MakeChain(fake->MakeChain());
+  auto fake = FakeStorageChain::SearchNone(10);
+  auto chain = storage.MakeChain(std::move(fake));
 
-  auto res = queryable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
+  auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), IsEmpty());
 }
 
 TEST(RangeOverlay, SearchLimited) {
-  auto fake = FakeStorage::SearchSubset(10, std::vector<uint32_t>{4});
+  auto fake = FakeStorageChain::SearchSubset(10, std::vector<uint32_t>{4});
   Range range(3, 5);
   RangeOverlay storage(&range);
-  auto queryable = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
-  auto res = queryable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 2));
+  auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 2));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1u));
 }
 
 TEST(RangeOverlay, SearchBitVector) {
-  auto fake = FakeStorage::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
+  auto fake =
+      FakeStorageChain::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
   Range range(3, 6);
   RangeOverlay storage(&range);
-  auto queryable = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
-  auto res = queryable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 3));
+  auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 3));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 2));
 }
 
 TEST(RangeOverlay, IndexSearch) {
-  auto fake = FakeStorage::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
+  auto fake =
+      FakeStorageChain::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
   Range range(3, 5);
   RangeOverlay storage(&range);
-  auto queryable = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> table_idx{1u, 0u, 3u};
-  RangeOrBitVector res = queryable->IndexSearch(
+  RangeOrBitVector res = chain->IndexSearch(
       FilterOp::kGe, SqlValue::Long(0u),
       Indices{table_idx.data(), static_cast<uint32_t>(table_idx.size()),
               Indices::State::kNonmonotonic});
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1u));
 }
 
+TEST(RangeOverlay, StableSort) {
+  std::vector<uint32_t> numeric_data{100, 99, 2, 0, 1};
+  NumericStorage<uint32_t> numeric(&numeric_data, ColumnType::kUint32, false);
+
+  Range range(2, 4);
+  RangeOverlay storage(&range);
+  auto chain = storage.MakeChain(numeric.MakeChain());
+
+  std::vector tokens{
+      column::DataLayerChain::SortToken{0, 0},
+      column::DataLayerChain::SortToken{1, 1},
+      column::DataLayerChain::SortToken{2, 2},
+  };
+  chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                    column::DataLayerChain::SortDirection::kAscending);
+  ASSERT_THAT(utils::ExtractPayloadForTesting(tokens), ElementsAre(1, 2, 0));
+}
+
 }  // namespace
 }  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/selector_overlay.cc b/src/trace_processor/db/column/selector_overlay.cc
index 835c6dc..ff1e463 100644
--- a/src/trace_processor/db/column/selector_overlay.cc
+++ b/src/trace_processor/db/column/selector_overlay.cc
@@ -34,18 +34,16 @@
 
 namespace perfetto::trace_processor::column {
 
-SelectorOverlay::SelectorOverlay(const BitVector* selector)
-    : selector_(selector) {}
-
-std::unique_ptr<DataLayerChain> SelectorOverlay::MakeChain(
-    std::unique_ptr<DataLayerChain> inner) {
-  return std::make_unique<ChainImpl>(std::move(inner), selector_);
-}
-
 SelectorOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> inner,
                                       const BitVector* selector)
     : inner_(std::move(inner)), selector_(selector) {}
 
+SingleSearchResult SelectorOverlay::ChainImpl::SingleSearch(FilterOp op,
+                                                            SqlValue sql_val,
+                                                            uint32_t i) const {
+  return inner_->SingleSearch(op, sql_val, selector_->IndexOfNthSet(i));
+}
+
 SearchValidationResult SelectorOverlay::ChainImpl::ValidateSearchConstraints(
     FilterOp op,
     SqlValue sql_val) const {
@@ -126,14 +124,13 @@
               indices.state});
 }
 
-void SelectorOverlay::ChainImpl::StableSort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
-}
-
-void SelectorOverlay::ChainImpl::Sort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_FATAL("Not implemented");
+void SelectorOverlay::ChainImpl::StableSort(SortToken* start,
+                                            SortToken* end,
+                                            SortDirection direction) const {
+  for (SortToken* it = start; it != end; ++it) {
+    it->index = selector_->IndexOfNthSet(it->index);
+  }
+  inner_->StableSort(start, end, direction);
 }
 
 void SelectorOverlay::ChainImpl::Serialize(StorageProto* storage) const {
diff --git a/src/trace_processor/db/column/selector_overlay.h b/src/trace_processor/db/column/selector_overlay.h
index ae50540..04f178a 100644
--- a/src/trace_processor/db/column/selector_overlay.h
+++ b/src/trace_processor/db/column/selector_overlay.h
@@ -34,15 +34,21 @@
 class SelectorOverlay final : public DataLayer {
  public:
   explicit SelectorOverlay(const BitVector*);
+  ~SelectorOverlay() override;
 
   std::unique_ptr<DataLayerChain> MakeChain(
-      std::unique_ptr<DataLayerChain>) override;
+      std::unique_ptr<DataLayerChain>,
+      ChainCreationArgs = ChainCreationArgs());
 
  private:
   class ChainImpl : public DataLayerChain {
    public:
     ChainImpl(std::unique_ptr<DataLayerChain>, const BitVector*);
 
+    SingleSearchResult SingleSearch(FilterOp,
+                                    SqlValue,
+                                    uint32_t) const override;
+
     SearchValidationResult ValidateSearchConstraints(FilterOp,
                                                      SqlValue) const override;
 
@@ -56,9 +62,9 @@
                                       SqlValue,
                                       Indices) const override;
 
-    void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
-    void Sort(uint32_t* rows, uint32_t rows_size) const override;
+    void StableSort(SortToken* start,
+                    SortToken* end,
+                    SortDirection) const override;
 
     void Serialize(StorageProto*) const override;
 
diff --git a/src/trace_processor/db/column/selector_overlay_unittest.cc b/src/trace_processor/db/column/selector_overlay_unittest.cc
index e4991eb..11d20f2 100644
--- a/src/trace_processor/db/column/selector_overlay_unittest.cc
+++ b/src/trace_processor/db/column/selector_overlay_unittest.cc
@@ -19,9 +19,11 @@
 #include <cstdint>
 #include <vector>
 
+#include "data_layer.h"
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/containers/bit_vector.h"
 #include "src/trace_processor/db/column/fake_storage.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column/utils.h"
 #include "test/gtest_and_gmock.h"
@@ -32,11 +34,23 @@
 using testing::ElementsAre;
 using testing::IsEmpty;
 
+TEST(SelectorOverlay, SingleSearch) {
+  BitVector selector{0, 1, 1, 0, 0, 1, 1, 0};
+  auto fake = FakeStorageChain::SearchSubset(8, Range(2, 5));
+  SelectorOverlay storage(&selector);
+  auto chain = storage.MakeChain(std::move(fake));
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 1),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 0),
+            SingleSearchResult::kNoMatch);
+}
+
 TEST(SelectorOverlay, SearchAll) {
   BitVector selector{0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1};
-  auto fake = FakeStorage::SearchAll(10);
+  auto fake = FakeStorageChain::SearchAll(10);
   SelectorOverlay storage(&selector);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1u, 2u, 3u));
@@ -44,9 +58,9 @@
 
 TEST(SelectorOverlay, SearchNone) {
   BitVector selector{0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1};
-  auto fake = FakeStorage::SearchNone(10);
+  auto fake = FakeStorageChain::SearchNone(10);
   SelectorOverlay storage(&selector);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), IsEmpty());
@@ -54,9 +68,9 @@
 
 TEST(SelectorOverlay, SearchLimited) {
   BitVector selector{0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1};
-  auto fake = FakeStorage::SearchSubset(10, Range(4, 5));
+  auto fake = FakeStorageChain::SearchSubset(10, Range(4, 5));
   SelectorOverlay storage(&selector);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 5));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2u));
@@ -64,9 +78,10 @@
 
 TEST(SelectorOverlay, SearchBitVector) {
   BitVector selector{0, 1, 1, 0, 0, 1, 1, 0};
-  auto fake = FakeStorage::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
+  auto fake =
+      FakeStorageChain::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
   SelectorOverlay storage(&selector);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 4));
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 2));
@@ -74,9 +89,10 @@
 
 TEST(SelectorOverlay, IndexSearch) {
   BitVector selector{0, 1, 1, 0, 0, 1, 1, 0};
-  auto fake = FakeStorage::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
+  auto fake =
+      FakeStorageChain::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
   SelectorOverlay storage(&selector);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> table_idx{1u, 0u, 3u};
   RangeOrBitVector res = chain->IndexSearch(
@@ -88,9 +104,9 @@
 
 TEST(SelectorOverlay, OrderedIndexSearchTrivial) {
   BitVector selector{1, 0, 1, 0, 1};
-  auto fake = FakeStorage::SearchAll(5);
+  auto fake = FakeStorageChain::SearchAll(5);
   SelectorOverlay storage(&selector);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> table_idx{1u, 0u, 2u};
   Range res = chain->OrderedIndexSearch(
@@ -103,9 +119,9 @@
 
 TEST(SelectorOverlay, OrderedIndexSearchNone) {
   BitVector selector{1, 0, 1, 0, 1};
-  auto fake = FakeStorage::SearchNone(5);
+  auto fake = FakeStorageChain::SearchNone(5);
   SelectorOverlay storage(&selector);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  auto chain = storage.MakeChain(std::move(fake));
 
   std::vector<uint32_t> table_idx{1u, 0u, 2u};
   Range res = chain->OrderedIndexSearch(
@@ -115,5 +131,39 @@
   ASSERT_EQ(res.size(), 0u);
 }
 
+TEST(SelectorOverlay, StableSort) {
+  std::vector<uint32_t> numeric_data{3, 1, 0, 0, 2, 4, 3, 4};
+  NumericStorage<uint32_t> numeric(&numeric_data, ColumnType::kUint32, false);
+
+  BitVector selector{0, 1, 0, 1, 1, 1, 1, 1};
+  SelectorOverlay overlay(&selector);
+  auto chain = overlay.MakeChain(numeric.MakeChain());
+
+  auto make_tokens = []() {
+    return std::vector{
+        column::DataLayerChain::SortToken{0, 0},
+        column::DataLayerChain::SortToken{1, 1},
+        column::DataLayerChain::SortToken{2, 2},
+        column::DataLayerChain::SortToken{3, 3},
+        column::DataLayerChain::SortToken{4, 4},
+        column::DataLayerChain::SortToken{5, 5},
+    };
+  };
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kAscending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(1, 0, 2, 4, 3, 5));
+  }
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kDescending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(3, 5, 4, 2, 0, 1));
+  }
+}
+
 }  // namespace
 }  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/set_id_storage.cc b/src/trace_processor/db/column/set_id_storage.cc
index aa05165..780761c 100644
--- a/src/trace_processor/db/column/set_id_storage.cc
+++ b/src/trace_processor/db/column/set_id_storage.cc
@@ -39,7 +39,6 @@
 #include "protos/perfetto/trace_processor/serialization.pbzero.h"
 
 namespace perfetto::trace_processor::column {
-
 namespace {
 
 using SetId = SetIdStorage::SetId;
@@ -67,16 +66,23 @@
 
 }  // namespace
 
-SetIdStorage::SetIdStorage(const std::vector<uint32_t>* values)
-    : values_(values) {}
-
-std::unique_ptr<DataLayerChain> SetIdStorage::MakeChain() {
-  return std::make_unique<ChainImpl>(values_);
-}
-
 SetIdStorage::ChainImpl::ChainImpl(const std::vector<uint32_t>* values)
     : values_(values) {}
 
+SingleSearchResult SetIdStorage::ChainImpl::SingleSearch(FilterOp op,
+                                                         SqlValue sql_val,
+                                                         uint32_t i) const {
+  if (sql_val.type != SqlValue::kLong ||
+      sql_val.long_value > std::numeric_limits<uint32_t>::max() ||
+      sql_val.long_value < std::numeric_limits<uint32_t>::min()) {
+    // Because of the large amount of code needing for handling comparisions
+    // with doubles or out of range values, just defer to the full search.
+    return SingleSearchResult::kNeedsFullSearch;
+  }
+  return utils::SingleSearchNumeric(op, (*values_)[i],
+                                    static_cast<uint32_t>(sql_val.long_value));
+}
+
 SearchValidationResult SetIdStorage::ChainImpl::ValidateSearchConstraints(
     FilterOp op,
     SqlValue val) const {
@@ -300,14 +306,23 @@
   return {};
 }
 
-void SetIdStorage::ChainImpl::StableSort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_ELOG("Not implemented");
-}
-
-void SetIdStorage::ChainImpl::Sort(uint32_t*, uint32_t) const {
-  // TODO(b/307482437): Implement.
-  PERFETTO_ELOG("Not implemented");
+void SetIdStorage::ChainImpl::StableSort(SortToken* start,
+                                         SortToken* end,
+                                         SortDirection direction) const {
+  switch (direction) {
+    case SortDirection::kAscending:
+      std::stable_sort(start, end,
+                       [this](const SortToken& a, const SortToken& b) {
+                         return (*values_)[a.index] < (*values_)[b.index];
+                       });
+      break;
+    case SortDirection::kDescending:
+      std::stable_sort(start, end,
+                       [this](const SortToken& a, const SortToken& b) {
+                         return (*values_)[a.index] > (*values_)[b.index];
+                       });
+      break;
+  }
 }
 
 void SetIdStorage::ChainImpl::Serialize(StorageProto* msg) const {
diff --git a/src/trace_processor/db/column/set_id_storage.h b/src/trace_processor/db/column/set_id_storage.h
index 1555751..64f14a3 100644
--- a/src/trace_processor/db/column/set_id_storage.h
+++ b/src/trace_processor/db/column/set_id_storage.h
@@ -34,14 +34,19 @@
   using SetId = uint32_t;
 
   explicit SetIdStorage(const std::vector<uint32_t>*);
+  ~SetIdStorage() override;
 
-  std::unique_ptr<DataLayerChain> MakeChain() override;
+  std::unique_ptr<DataLayerChain> MakeChain();
 
  private:
   class ChainImpl : public DataLayerChain {
    public:
     explicit ChainImpl(const std::vector<uint32_t>*);
 
+    SingleSearchResult SingleSearch(FilterOp,
+                                    SqlValue,
+                                    uint32_t) const override;
+
     SearchValidationResult ValidateSearchConstraints(FilterOp,
                                                      SqlValue) const override;
 
@@ -55,9 +60,9 @@
                                       SqlValue,
                                       Indices) const override;
 
-    void StableSort(uint32_t*, uint32_t) const override;
-
-    void Sort(uint32_t*, uint32_t) const override;
+    void StableSort(SortToken* start,
+                    SortToken* end,
+                    SortDirection direction) const override;
 
     void Serialize(StorageProto*) const override;
 
diff --git a/src/trace_processor/db/column/set_id_storage_unittest.cc b/src/trace_processor/db/column/set_id_storage_unittest.cc
index cd8403f..99371dc 100644
--- a/src/trace_processor/db/column/set_id_storage_unittest.cc
+++ b/src/trace_processor/db/column/set_id_storage_unittest.cc
@@ -22,6 +22,8 @@
 
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column/utils.h"
 #include "test/gtest_and_gmock.h"
@@ -42,6 +44,42 @@
 using testing::ElementsAre;
 using testing::IsEmpty;
 
+TEST(SetIdStorage, SearchSingle) {
+  std::vector<uint32_t> storage_data{0, 0, 2, 2, 4, 4, 6, 6};
+  SetIdStorage storage(&storage_data);
+  auto chain = storage.MakeChain();
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(4), 4),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(4), 3),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(4), 3),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(4), 4),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(4), 4),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(4), 1),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(4), 6),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(4), 4),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(4), 4),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(4), 6),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(4), 3),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(4), 4),
+            SingleSearchResult::kNoMatch);
+}
+
 TEST(SetIdStorage, InvalidSearchConstraints) {
   std::vector<uint32_t> storage_data{0, 0, 0, 3, 3, 3, 6, 6, 6, 9, 9, 9};
   SetIdStorage storage(&storage_data);
@@ -326,6 +364,35 @@
   ASSERT_EQ(res, Range(9, 10));
 }
 
+TEST(SetIdStorage, StableSort) {
+  std::vector<uint32_t> storage_data{0, 0, 0, 3, 3};
+  SetIdStorage storage(&storage_data);
+  auto chain = storage.MakeChain();
+  auto make_tokens = []() {
+    return std::vector{
+        column::DataLayerChain::SortToken{3, 3},
+        column::DataLayerChain::SortToken{2, 2},
+        column::DataLayerChain::SortToken{1, 1},
+        column::DataLayerChain::SortToken{0, 0},
+        column::DataLayerChain::SortToken{4, 4},
+    };
+  };
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kAscending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(2, 1, 0, 3, 4));
+  }
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kDescending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(3, 4, 2, 1, 0));
+  }
+}
+
 }  // namespace
 }  // namespace column
 }  // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/column/string_storage.cc b/src/trace_processor/db/column/string_storage.cc
index 9476c85..05f5932 100644
--- a/src/trace_processor/db/column/string_storage.cc
+++ b/src/trace_processor/db/column/string_storage.cc
@@ -21,6 +21,7 @@
 #include <functional>
 #include <iterator>
 #include <memory>
+#include <optional>
 #include <string>
 #include <utility>
 #include <vector>
@@ -196,20 +197,89 @@
 
 }  // namespace
 
-StringStorage::StringStorage(StringPool* string_pool,
-                             const std::vector<StringPool::Id>* data,
-                             bool is_sorted)
-    : data_(data), string_pool_(string_pool), is_sorted_(is_sorted) {}
-
-std::unique_ptr<DataLayerChain> StringStorage::MakeChain() {
-  return std::make_unique<ChainImpl>(string_pool_, data_, is_sorted_);
-}
-
 StringStorage::ChainImpl::ChainImpl(StringPool* string_pool,
                                     const std::vector<StringPool::Id>* data,
                                     bool is_sorted)
     : data_(data), string_pool_(string_pool), is_sorted_(is_sorted) {}
 
+SingleSearchResult StringStorage::ChainImpl::SingleSearch(FilterOp op,
+                                                          SqlValue sql_val,
+                                                          uint32_t i) const {
+  if (sql_val.type == SqlValue::kNull) {
+    if (op == FilterOp::kIsNull) {
+      return IsNull()((*data_)[i], StringPool::Id::Null())
+                 ? SingleSearchResult::kMatch
+                 : SingleSearchResult::kNoMatch;
+    }
+    if (op == FilterOp::kIsNotNull) {
+      return IsNotNull()((*data_)[i], StringPool::Id::Null())
+                 ? SingleSearchResult::kMatch
+                 : SingleSearchResult::kNoMatch;
+    }
+    return SingleSearchResult::kNeedsFullSearch;
+  }
+
+  if (sql_val.type != SqlValue::kString) {
+    return SingleSearchResult::kNeedsFullSearch;
+  }
+
+  switch (op) {
+    case FilterOp::kEq: {
+      std::optional<StringPool::Id> id =
+          string_pool_->GetId(base::StringView(sql_val.string_value));
+      return id && std::equal_to<>()((*data_)[i], *id)
+                 ? SingleSearchResult::kMatch
+                 : SingleSearchResult::kNoMatch;
+    }
+    case FilterOp::kNe: {
+      std::optional<StringPool::Id> id =
+          string_pool_->GetId(base::StringView(sql_val.string_value));
+      return !id || NotEqual()((*data_)[i], *id) ? SingleSearchResult::kMatch
+                                                 : SingleSearchResult::kNoMatch;
+    }
+    case FilterOp::kGe:
+      return GreaterEqual{string_pool_}(
+                 (*data_)[i], NullTermStringView(sql_val.string_value))
+                 ? SingleSearchResult::kMatch
+                 : SingleSearchResult::kNoMatch;
+    case FilterOp::kGt:
+      return Greater{string_pool_}((*data_)[i],
+                                   NullTermStringView(sql_val.string_value))
+                 ? SingleSearchResult::kMatch
+                 : SingleSearchResult::kNoMatch;
+    case FilterOp::kLe:
+      return LessEqual{string_pool_}((*data_)[i],
+                                     NullTermStringView(sql_val.string_value))
+                 ? SingleSearchResult::kMatch
+                 : SingleSearchResult::kNoMatch;
+    case FilterOp::kLt:
+      return Less{string_pool_}((*data_)[i],
+                                NullTermStringView(sql_val.string_value))
+                 ? SingleSearchResult::kMatch
+                 : SingleSearchResult::kNoMatch;
+    case FilterOp::kGlob: {
+      util::GlobMatcher matcher =
+          util::GlobMatcher::FromPattern(sql_val.string_value);
+      return Glob{string_pool_}((*data_)[i], matcher)
+                 ? SingleSearchResult::kMatch
+                 : SingleSearchResult::kNoMatch;
+    }
+    case FilterOp::kRegex: {
+      // Caller should ensure that the regex is valid.
+      base::StatusOr<regex::Regex> regex =
+          regex::Regex::Create(sql_val.AsString());
+      PERFETTO_CHECK(regex.status().ok());
+      return Regex{string_pool_}((*data_)[i], regex.value())
+                 ? SingleSearchResult::kMatch
+                 : SingleSearchResult::kNoMatch;
+    }
+    case FilterOp::kIsNull:
+    case FilterOp::kIsNotNull:
+      PERFETTO_FATAL("Already handled above");
+  }
+  PERFETTO_FATAL("For GCC");
+}
+
 SearchValidationResult StringStorage::ChainImpl::ValidateSearchConstraints(
     FilterOp op,
     SqlValue val) const {
@@ -547,25 +617,29 @@
     case FilterOp::kRegex:
       PERFETTO_FATAL("Shouldn't be called");
   }
-  PERFETTO_FATAL("For gcc");
+  PERFETTO_FATAL("For GCC");
 }
 
-void StringStorage::ChainImpl::StableSort(uint32_t* indices,
-                                          uint32_t indices_size) const {
-  std::stable_sort(indices, indices + indices_size,
-                   [this](uint32_t a_idx, uint32_t b_idx) {
-                     return string_pool_->Get((*data_)[a_idx]) <
-                            string_pool_->Get((*data_)[b_idx]);
-                   });
-}
-
-void StringStorage::ChainImpl::Sort(uint32_t* indices,
-                                    uint32_t indices_size) const {
-  std::sort(indices, indices + indices_size,
-            [this](uint32_t a_idx, uint32_t b_idx) {
-              return string_pool_->Get((*data_)[a_idx]) <
-                     string_pool_->Get((*data_)[b_idx]);
-            });
+void StringStorage::ChainImpl::StableSort(SortToken* start,
+                                          SortToken* end,
+                                          SortDirection direction) const {
+  switch (direction) {
+    case SortDirection::kAscending:
+      std::stable_sort(start, end,
+                       [this](const SortToken& a, const SortToken& b) {
+                         return string_pool_->Get((*data_)[a.index]) <
+                                string_pool_->Get((*data_)[b.index]);
+                       });
+      return;
+    case SortDirection::kDescending:
+      std::stable_sort(start, end,
+                       [this](const SortToken& a, const SortToken& b) {
+                         return string_pool_->Get((*data_)[a.index]) >
+                                string_pool_->Get((*data_)[b.index]);
+                       });
+      return;
+  }
+  PERFETTO_FATAL("For GCC");
 }
 
 void StringStorage::ChainImpl::Serialize(StorageProto* msg) const {
diff --git a/src/trace_processor/db/column/string_storage.h b/src/trace_processor/db/column/string_storage.h
index b8fee2d..d61aef5 100644
--- a/src/trace_processor/db/column/string_storage.h
+++ b/src/trace_processor/db/column/string_storage.h
@@ -35,8 +35,9 @@
   StringStorage(StringPool* string_pool,
                 const std::vector<StringPool::Id>* data,
                 bool is_sorted = false);
+  ~StringStorage() override;
 
-  std::unique_ptr<DataLayerChain> MakeChain() override;
+  std::unique_ptr<DataLayerChain> MakeChain();
 
  private:
   class ChainImpl : public DataLayerChain {
@@ -45,6 +46,10 @@
               const std::vector<StringPool::Id>* data,
               bool is_sorted);
 
+    SingleSearchResult SingleSearch(FilterOp,
+                                    SqlValue,
+                                    uint32_t) const override;
+
     SearchValidationResult ValidateSearchConstraints(FilterOp,
                                                      SqlValue) const override;
 
@@ -58,9 +63,9 @@
                                       SqlValue,
                                       Indices) const override;
 
-    void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
-    void Sort(uint32_t* rows, uint32_t rows_size) const override;
+    void StableSort(SortToken* start,
+                    SortToken* end,
+                    SortDirection direction) const override;
 
     void Serialize(StorageProto*) const override;
 
diff --git a/src/trace_processor/db/column/string_storage_unittest.cc b/src/trace_processor/db/column/string_storage_unittest.cc
index 4df8795..303ab66 100644
--- a/src/trace_processor/db/column/string_storage_unittest.cc
+++ b/src/trace_processor/db/column/string_storage_unittest.cc
@@ -24,6 +24,7 @@
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/containers/bit_vector.h"
 #include "src/trace_processor/containers/string_pool.h"
+#include "src/trace_processor/db/column/data_layer.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column/utils.h"
 #include "test/gtest_and_gmock.h"
@@ -34,7 +35,7 @@
 using testing::ElementsAre;
 using testing::IsEmpty;
 
-TEST(StringStorage, Search) {
+TEST(StringStorage, SearchOneElement) {
   std::vector<std::string> strings{"cheese",  "pasta", "pizza",
                                    "pierogi", "onion", "fries"};
   std::vector<StringPool::Id> ids;
@@ -43,45 +44,107 @@
     ids.push_back(pool.InternString(base::StringView(string)));
   }
   ids.insert(ids.begin() + 3, StringPool::Id::Null());
+  // 0:"cheese", 1:"pasta", 2:"pizza", 3:NULL, 4:"pierogi", 5:"onion", 6:"fries"
   StringStorage storage(&pool, &ids);
-  auto queriable = storage.MakeChain();
+  auto chain = storage.MakeChain();
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::String("pierogi"), 4),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::String("pierogi"), 3),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::String("foo"), 0),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::String("pierogi"), 0),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::String("pierogi"), 4),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::String("pierogi"), 4),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::String("pierogi"), 1),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::String("pierogi"), 2),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::String("pierogi"), 5),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::String("pierogi"), 4),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::String("pierogi"), 2),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::String("pierogi"), 0),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::String("pierogi"), 4),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 3),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 4),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 4),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 3),
+            SingleSearchResult::kNoMatch);
+
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGlob, SqlValue::String("p*"), 1),
+            SingleSearchResult::kMatch);
+  ASSERT_EQ(chain->SingleSearch(FilterOp::kGlob, SqlValue::String("p*"), 0),
+            SingleSearchResult::kNoMatch);
+}
+
+TEST(StringStorage, Search) {
+  std::vector<std::string> strings{"cheese",  "pasta", "pizza",
+                                   "pierogi", "onion", "fries"};
+  std::vector<StringPool::Id> ids;
+  StringPool pool;
+  ids.reserve(strings.size());
+  for (const auto& string : strings) {
+    ids.push_back(pool.InternString(base::StringView(string)));
+  }
+  ids.insert(ids.begin() + 3, StringPool::Id::Null());
+  StringStorage storage(&pool, &ids);
+  auto chain = storage.MakeChain();
   SqlValue val = SqlValue::String("pierogi");
   Range filter_range(0, 7);
 
   FilterOp op = FilterOp::kEq;
-  auto res = queriable->Search(op, val, filter_range);
+  auto res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(4));
 
   op = FilterOp::kNe;
-  res = queriable->Search(op, val, filter_range);
+  res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2, 5, 6));
 
   op = FilterOp::kLt;
-  res = queriable->Search(op, val, filter_range);
+  res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 5, 6));
 
   op = FilterOp::kLe;
-  res = queriable->Search(op, val, filter_range);
+  res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 4, 5, 6));
 
   op = FilterOp::kGt;
-  res = queriable->Search(op, val, filter_range);
+  res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2));
 
   op = FilterOp::kGe;
-  res = queriable->Search(op, val, filter_range);
+  res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 4));
 
   op = FilterOp::kIsNull;
-  res = queriable->Search(op, SqlValue(), filter_range);
+  res = chain->Search(op, SqlValue(), filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3));
 
   op = FilterOp::kIsNotNull;
-  res = queriable->Search(op, SqlValue(), filter_range);
+  res = chain->Search(op, SqlValue(), filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2, 4, 5, 6));
 
   op = FilterOp::kGlob;
-  res = queriable->Search(op, SqlValue::String("p*"), filter_range);
+  res = chain->Search(op, SqlValue::String("p*"), filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1, 2, 4));
 }
 
@@ -95,46 +158,46 @@
   }
   ids.insert(ids.begin() + 3, StringPool::Id::Null());
   StringStorage storage(&pool, &ids);
-  auto queriable = storage.MakeChain();
+  auto chain = storage.MakeChain();
   SqlValue val = SqlValue::String("pierogi");
   // "fries", "onion", "pierogi", NULL, "pizza", "pasta", "cheese"
   std::vector<uint32_t> indices_vec{6, 5, 4, 3, 2, 1, 0};
   Indices indices{indices_vec.data(), 7, Indices::State::kNonmonotonic};
 
   FilterOp op = FilterOp::kEq;
-  auto res = queriable->IndexSearch(op, val, indices);
+  auto res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2));
 
   op = FilterOp::kNe;
-  res = queriable->IndexSearch(op, val, indices);
+  res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 4, 5, 6));
 
   op = FilterOp::kLt;
-  res = queriable->IndexSearch(op, val, indices);
+  res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 5, 6));
 
   op = FilterOp::kLe;
-  res = queriable->IndexSearch(op, val, indices);
+  res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2, 5, 6));
 
   op = FilterOp::kGt;
-  res = queriable->IndexSearch(op, val, indices);
+  res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(4));
 
   op = FilterOp::kGe;
-  res = queriable->IndexSearch(op, val, indices);
+  res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 4));
 
   op = FilterOp::kIsNull;
-  res = queriable->IndexSearch(op, SqlValue(), indices);
+  res = chain->IndexSearch(op, SqlValue(), indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3));
 
   op = FilterOp::kIsNotNull;
-  res = queriable->IndexSearch(op, SqlValue(), indices);
+  res = chain->IndexSearch(op, SqlValue(), indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2, 4, 5, 6));
 
   op = FilterOp::kGlob;
-  res = queriable->IndexSearch(op, SqlValue::String("p*"), indices);
+  res = chain->IndexSearch(op, SqlValue::String("p*"), indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 4, 5));
 }
 
@@ -150,10 +213,9 @@
   ids.insert(ids.begin() + 3, StringPool::Id::Null());
 
   StringStorage storage(&pool, &ids);
-  auto queriable = storage.MakeChain();
+  auto chain = storage.MakeChain();
   BitVector bv =
-      queriable
-          ->Search(FilterOp::kRegex, SqlValue::String(".*zz.*"), Range(0, 7))
+      chain->Search(FilterOp::kRegex, SqlValue::String(".*zz.*"), Range(0, 7))
           .TakeIfBitVector();
 
   ASSERT_EQ(bv.CountSetBits(), 1u);
@@ -170,9 +232,9 @@
   ids.insert(ids.begin() + 3, StringPool::Id::Null());
 
   StringStorage storage(&pool, &ids);
-  auto queriable = storage.MakeChain();
+  auto chain = storage.MakeChain();
   BitVector bv =
-      queriable->Search(FilterOp::kRegex, SqlValue::String("*"), Range(0, 7))
+      chain->Search(FilterOp::kRegex, SqlValue::String("*"), Range(0, 7))
           .TakeIfBitVector();
 
   ASSERT_EQ(bv.CountSetBits(), 0u);
@@ -188,36 +250,36 @@
     ids.push_back(pool.InternString(base::StringView(string)));
   }
   StringStorage storage(&pool, &ids, true);
-  auto queriable = storage.MakeChain();
+  auto chain = storage.MakeChain();
   SqlValue val = SqlValue::String("cheese");
   Range filter_range(0, 6);
 
   FilterOp op = FilterOp::kEq;
-  auto res = queriable->Search(op, val, filter_range);
+  auto res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2));
 
   op = FilterOp::kNe;
-  res = queriable->Search(op, val, filter_range);
+  res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 3, 4, 5));
 
   op = FilterOp::kLt;
-  res = queriable->Search(op, val, filter_range);
+  res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1));
 
   op = FilterOp::kLe;
-  res = queriable->Search(op, val, filter_range);
+  res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2));
 
   op = FilterOp::kGt;
-  res = queriable->Search(op, val, filter_range);
+  res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3, 4, 5));
 
   op = FilterOp::kGe;
-  res = queriable->Search(op, val, filter_range);
+  res = chain->Search(op, val, filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 3, 4, 5));
 
   op = FilterOp::kGlob;
-  res = queriable->Search(op, SqlValue::String("*e"), filter_range);
+  res = chain->Search(op, SqlValue::String("*e"), filter_range);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 2));
 }
 
@@ -230,38 +292,38 @@
     ids.push_back(pool.InternString(base::StringView(string)));
   }
   StringStorage storage(&pool, &ids, true);
-  auto queriable = storage.MakeChain();
+  auto chain = storage.MakeChain();
   SqlValue val = SqlValue::String("cheese");
   // fries, eggplant, cheese, burger
   std::vector<uint32_t> indices_vec{5, 4, 2, 1};
   Indices indices{indices_vec.data(), 4, Indices::State::kNonmonotonic};
 
   FilterOp op = FilterOp::kEq;
-  auto res = queriable->IndexSearch(op, val, indices);
+  auto res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2));
 
   op = FilterOp::kNe;
-  res = queriable->IndexSearch(op, val, indices);
+  res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 3));
 
   op = FilterOp::kLt;
-  res = queriable->IndexSearch(op, val, indices);
+  res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3));
 
   op = FilterOp::kLe;
-  res = queriable->IndexSearch(op, val, indices);
+  res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 3));
 
   op = FilterOp::kGt;
-  res = queriable->IndexSearch(op, val, indices);
+  res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1));
 
   op = FilterOp::kGe;
-  res = queriable->IndexSearch(op, val, indices);
+  res = chain->IndexSearch(op, val, indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2));
 
   op = FilterOp::kGlob;
-  res = queriable->IndexSearch(op, SqlValue::String("*e"), indices);
+  res = chain->IndexSearch(op, SqlValue::String("*e"), indices);
   ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2));
 }
 
@@ -274,34 +336,34 @@
     ids.push_back(pool.InternString(base::StringView(string)));
   }
   StringStorage storage(&pool, &ids);
-  auto queriable = storage.MakeChain();
+  auto chain = storage.MakeChain();
   SqlValue val = SqlValue::String("pierogi");
   // cheese, fries, onion, pasta, pierogi, pizza
   std::vector<uint32_t> indices_vec{0, 5, 4, 1, 3, 2};
   Indices indices{indices_vec.data(), 6, Indices::State::kNonmonotonic};
 
   FilterOp op = FilterOp::kEq;
-  Range res = queriable->OrderedIndexSearch(op, val, indices);
+  Range res = chain->OrderedIndexSearch(op, val, indices);
   ASSERT_EQ(res.start, 4u);
   ASSERT_EQ(res.end, 5u);
 
   op = FilterOp::kLt;
-  res = queriable->OrderedIndexSearch(op, val, indices);
+  res = chain->OrderedIndexSearch(op, val, indices);
   ASSERT_EQ(res.start, 0u);
   ASSERT_EQ(res.end, 4u);
 
   op = FilterOp::kLe;
-  res = queriable->OrderedIndexSearch(op, val, indices);
+  res = chain->OrderedIndexSearch(op, val, indices);
   ASSERT_EQ(res.start, 0u);
   ASSERT_EQ(res.end, 5u);
 
   op = FilterOp::kGt;
-  res = queriable->OrderedIndexSearch(op, val, indices);
+  res = chain->OrderedIndexSearch(op, val, indices);
   ASSERT_EQ(res.start, 5u);
   ASSERT_EQ(res.end, 6u);
 
   op = FilterOp::kGe;
-  res = queriable->OrderedIndexSearch(op, val, indices);
+  res = chain->OrderedIndexSearch(op, val, indices);
   ASSERT_EQ(res.start, 4u);
   ASSERT_EQ(res.end, 6u);
 }
@@ -315,12 +377,11 @@
     ids.push_back(pool.InternString(base::StringView(string)));
   }
   StringStorage storage(&pool, &ids);
-  auto queriable = storage.MakeChain();
+  auto chain = storage.MakeChain();
 
   std::vector<uint32_t> indices_vec{0, 2, 5, 7};
   Indices indices{indices_vec.data(), 4, Indices::State::kNonmonotonic};
-  auto res =
-      queriable->OrderedIndexSearch(FilterOp::kIsNull, SqlValue(), indices);
+  auto res = chain->OrderedIndexSearch(FilterOp::kIsNull, SqlValue(), indices);
   ASSERT_EQ(res.start, 0u);
   ASSERT_EQ(res.end, 2u);
 }
@@ -334,15 +395,54 @@
     ids.push_back(pool.InternString(base::StringView(string)));
   }
   StringStorage storage(&pool, &ids);
-  auto queriable = storage.MakeChain();
+  auto chain = storage.MakeChain();
 
   std::vector<uint32_t> indices_vec{0, 2, 5, 7};
   Indices indices{indices_vec.data(), 4, Indices::State::kNonmonotonic};
   auto res =
-      queriable->OrderedIndexSearch(FilterOp::kIsNotNull, SqlValue(), indices);
+      chain->OrderedIndexSearch(FilterOp::kIsNotNull, SqlValue(), indices);
   ASSERT_EQ(res.start, 2u);
   ASSERT_EQ(res.end, 4u);
 }
 
+TEST(StringStorage, StableSort) {
+  std::vector<std::string> strings{"cheese",  "pasta", "pizza",
+                                   "pierogi", "onion", "fries"};
+  std::vector<StringPool::Id> ids(3, StringPool::Id::Null());
+  StringPool pool;
+  for (const auto& string : strings) {
+    ids.push_back(pool.InternString(base::StringView(string)));
+  }
+  StringStorage storage(&pool, &ids);
+  auto chain = storage.MakeChain();
+  auto make_tokens = []() {
+    return std::vector{
+        column::DataLayerChain::SortToken{0, 0},
+        column::DataLayerChain::SortToken{1, 1},
+        column::DataLayerChain::SortToken{2, 2},
+        column::DataLayerChain::SortToken{3, 3},
+        column::DataLayerChain::SortToken{4, 4},
+        column::DataLayerChain::SortToken{5, 5},
+        column::DataLayerChain::SortToken{6, 6},
+        column::DataLayerChain::SortToken{7, 7},
+        column::DataLayerChain::SortToken{8, 8},
+    };
+  };
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kAscending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(0, 1, 2, 3, 8, 7, 4, 6, 5));
+  }
+  {
+    auto tokens = make_tokens();
+    chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+                      column::DataLayerChain::SortDirection::kDescending);
+    ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+                ElementsAre(5, 6, 4, 7, 8, 3, 0, 1, 2));
+  }
+}
+
 }  // namespace
 }  // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/types.h b/src/trace_processor/db/column/types.h
index 274ac90..803c6ce 100644
--- a/src/trace_processor/db/column/types.h
+++ b/src/trace_processor/db/column/types.h
@@ -29,6 +29,14 @@
 
 using Range = RowMap::Range;
 
+// Result of calling Storage::SingleSearch function.
+enum class SingleSearchResult {
+  kMatch,            // The specified row matches the constraint.
+  kNoMatch,          // The specified row does not matches the constraint.
+  kNeedsFullSearch,  // SingleSearch was unable to determine if the row meets
+                     // the crtiteria, a call to *Search is required.
+};
+
 // Result of calling Storage::ValidateSearchResult function.
 enum class SearchValidationResult {
   kOk,       // It makes sense to run search
diff --git a/src/trace_processor/db/column/utils.cc b/src/trace_processor/db/column/utils.cc
index 6b83ae7..efec000 100644
--- a/src/trace_processor/db/column/utils.cc
+++ b/src/trace_processor/db/column/utils.cc
@@ -15,18 +15,26 @@
  */
 
 #include "src/trace_processor/db/column/utils.h"
-#include <optional>
-#include "perfetto/base/logging.h"
 
-namespace perfetto {
-namespace trace_processor {
-namespace column {
-namespace utils {
+#include <cmath>
+#include <cstdint>
+#include <functional>
+#include <optional>
+#include <utility>
+#include <vector>
+
+#include "perfetto/base/logging.h"
+#include "perfetto/trace_processor/basic_types.h"
+#include "src/trace_processor/containers/row_map.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/types.h"
+
+namespace perfetto::trace_processor::column::utils {
 
 SearchValidationResult CompareIntColumnWithDouble(FilterOp op,
                                                   SqlValue* sql_val) {
   double double_val = sql_val->AsDouble();
-  if (std::equal_to<double>()(
+  if (std::equal_to<>()(
           double_val, static_cast<double>(static_cast<uint32_t>(double_val)))) {
     // If double is the same as uint32_t, we should just "cast" the |sql_val|
     // to be treated as long.
@@ -70,6 +78,16 @@
   return rm.GetAllIndices();
 }
 
+std::vector<uint32_t> ExtractPayloadForTesting(
+    std::vector<column::DataLayerChain::SortToken>& tokens) {
+  std::vector<uint32_t> payload;
+  payload.reserve(tokens.size());
+  for (const auto& token : tokens) {
+    payload.push_back(token.payload);
+  }
+  return payload;
+}
+
 std::optional<Range> CanReturnEarly(SearchValidationResult res, Range range) {
   switch (res) {
     case SearchValidationResult::kOk:
@@ -94,8 +112,5 @@
   }
   PERFETTO_FATAL("For GCC");
 }
-}  // namespace utils
 
-}  // namespace column
-}  // namespace trace_processor
-}  // namespace perfetto
+}  // namespace perfetto::trace_processor::column::utils
diff --git a/src/trace_processor/db/column/utils.h b/src/trace_processor/db/column/utils.h
index 4f48254..b1c71a3 100644
--- a/src/trace_processor/db/column/utils.h
+++ b/src/trace_processor/db/column/utils.h
@@ -16,17 +16,18 @@
 #ifndef SRC_TRACE_PROCESSOR_DB_COLUMN_UTILS_H_
 #define SRC_TRACE_PROCESSOR_DB_COLUMN_UTILS_H_
 
+#include <cstdint>
+#include <functional>
 #include <optional>
+#include <vector>
+
 #include "perfetto/base/logging.h"
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/containers/bit_vector.h"
-#include "src/trace_processor/containers/row_map.h"
+#include "src/trace_processor/db/column/data_layer.h"
 #include "src/trace_processor/db/column/types.h"
 
-namespace perfetto {
-namespace trace_processor {
-namespace column {
-namespace utils {
+namespace perfetto::trace_processor::column::utils {
 
 template <typename Comparator, typename ValType, typename DataType>
 void LinearSearchWithComparator(ValType val,
@@ -88,6 +89,38 @@
   }
 }
 
+template <typename T>
+SingleSearchResult SingleSearchNumeric(FilterOp op, T left, T right) {
+  switch (op) {
+    case FilterOp::kEq:
+      return std::equal_to<T>()(left, right) ? SingleSearchResult::kMatch
+                                             : SingleSearchResult::kNoMatch;
+    case FilterOp::kNe:
+      return std::not_equal_to<T>()(left, right) ? SingleSearchResult::kMatch
+                                                 : SingleSearchResult::kNoMatch;
+    case FilterOp::kGe:
+      return std::greater_equal<T>()(left, right)
+                 ? SingleSearchResult::kMatch
+                 : SingleSearchResult::kNoMatch;
+    case FilterOp::kGt:
+      return std::greater<T>()(left, right) ? SingleSearchResult::kMatch
+                                            : SingleSearchResult::kNoMatch;
+    case FilterOp::kLe:
+      return std::less_equal<T>()(left, right) ? SingleSearchResult::kMatch
+                                               : SingleSearchResult::kNoMatch;
+    case FilterOp::kLt:
+      return std::less<T>()(left, right) ? SingleSearchResult::kMatch
+                                         : SingleSearchResult::kNoMatch;
+    case FilterOp::kIsNotNull:
+      return SingleSearchResult::kMatch;
+    case FilterOp::kGlob:
+    case FilterOp::kRegex:
+    case FilterOp::kIsNull:
+      return SingleSearchResult::kNoMatch;
+  }
+  PERFETTO_FATAL("For GCC");
+}
+
 // Used for comparing the integer column ({u|}int{32|64}) with a double value.
 // If further search is required it would return kOk and change the SqlValue to
 // a `SqlLong` which would return real results.
@@ -103,11 +136,11 @@
 std::optional<Range> CanReturnEarly(SearchValidationResult,
                                     uint32_t indices_size);
 
+std::vector<uint32_t> ExtractPayloadForTesting(
+    std::vector<column::DataLayerChain::SortToken>&);
+
 std::vector<uint32_t> ToIndexVectorForTests(RangeOrBitVector&);
 
-}  // namespace utils
+}  // namespace perfetto::trace_processor::column::utils
 
-}  // namespace column
-}  // namespace trace_processor
-}  // namespace perfetto
 #endif  // SRC_TRACE_PROCESSOR_DB_COLUMN_UTILS_H_
diff --git a/src/trace_processor/db/column_storage.h b/src/trace_processor/db/column_storage.h
index 294c1cf..bc30a0d 100644
--- a/src/trace_processor/db/column_storage.h
+++ b/src/trace_processor/db/column_storage.h
@@ -22,6 +22,7 @@
 #include <optional>
 #include <vector>
 
+#include "perfetto/base/compiler.h"
 #include "perfetto/base/logging.h"
 #include "perfetto/public/compiler.h"
 #include "src/trace_processor/containers/bit_vector.h"
@@ -62,7 +63,7 @@
   T Get(uint32_t idx) const { return vector_[idx]; }
   void Append(T val) { vector_.emplace_back(val); }
   void Set(uint32_t idx, T val) { vector_[idx] = val; }
-  void ShrinkToFit() { vector_.shrink_to_fit(); }
+  PERFETTO_NO_INLINE void ShrinkToFit() { vector_.shrink_to_fit(); }
   const std::vector<T>& vector() const { return vector_; }
 
   const void* data() const final { return vector_.data(); }
@@ -137,7 +138,7 @@
     }
   }
   bool IsDense() const { return mode_ == Mode::kDense; }
-  void ShrinkToFit() {
+  PERFETTO_NO_INLINE void ShrinkToFit() {
     data_.shrink_to_fit();
     valid_.ShrinkToFit();
   }
diff --git a/src/trace_processor/db/query_executor.cc b/src/trace_processor/db/query_executor.cc
index 82ddb10..bd15245 100644
--- a/src/trace_processor/db/query_executor.cc
+++ b/src/trace_processor/db/query_executor.cc
@@ -16,30 +16,14 @@
 
 #include <algorithm>
 #include <cstdint>
-#include <memory>
-#include <optional>
 #include <utility>
 #include <vector>
 
-#include "perfetto/base/compiler.h"
 #include "perfetto/base/logging.h"
-#include "perfetto/ext/base/small_vector.h"
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/containers/bit_vector.h"
 #include "src/trace_processor/containers/row_map.h"
-#include "src/trace_processor/containers/string_pool.h"
-#include "src/trace_processor/db/column.h"
-#include "src/trace_processor/db/column/arrangement_overlay.h"
 #include "src/trace_processor/db/column/data_layer.h"
-#include "src/trace_processor/db/column/dense_null_overlay.h"
-#include "src/trace_processor/db/column/dummy_storage.h"
-#include "src/trace_processor/db/column/id_storage.h"
-#include "src/trace_processor/db/column/null_overlay.h"
-#include "src/trace_processor/db/column/numeric_storage.h"
-#include "src/trace_processor/db/column/range_overlay.h"
-#include "src/trace_processor/db/column/selector_overlay.h"
-#include "src/trace_processor/db/column/set_id_storage.h"
-#include "src/trace_processor/db/column/string_storage.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/query_executor.h"
 #include "src/trace_processor/db/table.h"
@@ -56,9 +40,23 @@
                                  const column::DataLayerChain& chain,
                                  RowMap* rm) {
   // Shortcut of empty row map.
-  if (rm->empty())
+  uint32_t rm_size = rm->size();
+  if (rm_size == 0)
     return;
 
+  uint32_t rm_first = rm->Get(0);
+  if (rm_size == 1) {
+    switch (chain.SingleSearch(c.op, c.value, rm_first)) {
+      case SingleSearchResult::kMatch:
+        return;
+      case SingleSearchResult::kNoMatch:
+        rm->Clear();
+        return;
+      case SingleSearchResult::kNeedsFullSearch:
+        break;
+    }
+  }
+
   // Comparison of NULL with any operation apart from |IS_NULL| and
   // |IS_NOT_NULL| should return no rows.
   if (c.value.is_null() && c.op != FilterOp::kIsNull &&
@@ -67,13 +65,11 @@
     return;
   }
 
-  uint32_t rm_size = rm->size();
-  uint32_t rm_first = rm->Get(0);
   uint32_t rm_last = rm->Get(rm_size - 1);
   uint32_t range_size = rm_last - rm_first;
 
-  // If the number of elements in the rowmap is small or the number of elements
-  // is less than 1/10th of the range, use indexed filtering.
+  // If the number of elements in the rowmap is small or the number of
+  // elements is less than 1/10th of the range, use indexed filtering.
   // TODO(b/283763282): use Overlay estimations.
   bool disallows_index_search = rm->IsRange();
   bool prefers_index_search =
@@ -99,8 +95,8 @@
       Range range = std::move(res).TakeIfRange();
       *rm = RowMap(range.start, range.end);
     } else {
-      // The BitVector was already limited on the RowMap when created, so we can
-      // take it as it is.
+      // The BitVector was already limited on the RowMap when created, so we
+      // can take it as it is.
       *rm = RowMap(std::move(res).TakeIfBitVector());
     }
     return;
@@ -156,152 +152,70 @@
                                    const std::vector<Constraint>& c_vec) {
   RowMap rm(0, table->row_count());
   for (const auto& c : c_vec) {
-    if (rm.empty()) {
-      return rm;
-    }
-
-    const ColumnLegacy& col = table->columns()[c.col_idx];
-    uint32_t column_size =
-        col.IsId() ? col.overlay().row_map().Max() : col.storage_base().size();
-
-    // RowMap size is 1.
-    bool use_legacy = rm.size() == 1;
-
-    if (use_legacy) {
-      col.FilterInto(c.op, c.value, &rm);
-      continue;
-    }
-
-    // Create storage
-    base::SmallVector<std::unique_ptr<column::DataLayer>, 4> data_layers;
-    std::unique_ptr<column::DataLayerChain> chain;
-    if (col.IsSetId()) {
-      if (col.IsNullable()) {
-        data_layers.emplace_back(std::make_unique<column::SetIdStorage>(
-            &col.storage<std::optional<uint32_t>>().non_null_vector()));
-        chain = data_layers.back()->MakeChain();
-      } else {
-        data_layers.emplace_back(std::make_unique<column::SetIdStorage>(
-            &col.storage<uint32_t>().vector()));
-        chain = data_layers.back()->MakeChain();
-      }
-    } else {
-      switch (col.col_type()) {
-        case ColumnType::kDummy:
-          data_layers.emplace_back(std::make_unique<column::DummyStorage>());
-          chain = data_layers.back()->MakeChain();
-          break;
-        case ColumnType::kId:
-          data_layers.emplace_back(std::make_unique<column::IdStorage>());
-          chain = data_layers.back()->MakeChain();
-          break;
-        case ColumnType::kString:
-          data_layers.emplace_back(std::make_unique<column::StringStorage>(
-              table->string_pool(), &col.storage<StringPool::Id>().vector(),
-              col.IsSorted()));
-          chain = data_layers.back()->MakeChain();
-          break;
-        case ColumnType::kInt64:
-          if (col.IsNullable()) {
-            data_layers.emplace_back(
-                std::make_unique<column::NumericStorage<int64_t>>(
-                    &col.storage<std::optional<int64_t>>().non_null_vector(),
-                    col.col_type(), col.IsSorted()));
-            chain = data_layers.back()->MakeChain();
-
-          } else {
-            data_layers.emplace_back(
-                std::make_unique<column::NumericStorage<int64_t>>(
-                    &col.storage<int64_t>().vector(), col.col_type(),
-                    col.IsSorted()));
-            chain = data_layers.back()->MakeChain();
-          }
-          break;
-        case ColumnType::kUint32:
-          if (col.IsNullable()) {
-            data_layers.emplace_back(
-                std::make_unique<column::NumericStorage<uint32_t>>(
-                    &col.storage<std::optional<uint32_t>>().non_null_vector(),
-                    col.col_type(), col.IsSorted()));
-            chain = data_layers.back()->MakeChain();
-          } else {
-            data_layers.emplace_back(
-                std::make_unique<column::NumericStorage<uint32_t>>(
-                    &col.storage<uint32_t>().vector(), col.col_type(),
-                    col.IsSorted()));
-            chain = data_layers.back()->MakeChain();
-          }
-          break;
-        case ColumnType::kInt32:
-          if (col.IsNullable()) {
-            data_layers.emplace_back(
-                std::make_unique<column::NumericStorage<int32_t>>(
-                    &col.storage<std::optional<int32_t>>().non_null_vector(),
-                    col.col_type(), col.IsSorted()));
-            chain = data_layers.back()->MakeChain();
-          } else {
-            data_layers.emplace_back(
-                std::make_unique<column::NumericStorage<int32_t>>(
-                    &col.storage<int32_t>().vector(), col.col_type(),
-                    col.IsSorted()));
-            chain = data_layers.back()->MakeChain();
-          }
-          break;
-        case ColumnType::kDouble:
-          if (col.IsNullable()) {
-            data_layers.emplace_back(
-                std::make_unique<column::NumericStorage<double>>(
-                    &col.storage<std::optional<double>>().non_null_vector(),
-                    col.col_type(), col.IsSorted()));
-            chain = data_layers.back()->MakeChain();
-          } else {
-            data_layers.emplace_back(
-                std::make_unique<column::NumericStorage<double>>(
-                    &col.storage<double>().vector(), col.col_type(),
-                    col.IsSorted()));
-            chain = data_layers.back()->MakeChain();
-          }
-      }
-    }
-
-    if (col.IsNullable()) {
-      // String columns are inherently nullable: null values are signified
-      // with Id::Null().
-      PERFETTO_CHECK(col.col_type() != ColumnType::kString);
-      if (col.IsDense()) {
-        data_layers.emplace_back(std::make_unique<column::DenseNullOverlay>(
-            col.storage_base().bv()));
-        chain = data_layers.back()->MakeChain(std::move(chain));
-      } else {
-        data_layers.emplace_back(
-            std::make_unique<column::NullOverlay>(col.storage_base().bv()));
-        chain = data_layers.back()->MakeChain(std::move(chain));
-      }
-    }
-    if (col.overlay().row_map().IsIndexVector()) {
-      data_layers.emplace_back(std::make_unique<column::ArrangementOverlay>(
-          col.overlay().row_map().GetIfIndexVector(),
-          Indices::State::kNonmonotonic, col.IsSorted()));
-      chain = data_layers.back()->MakeChain(std::move(chain));
-    }
-    if (col.overlay().row_map().IsBitVector()) {
-      data_layers.emplace_back(std::make_unique<column::SelectorOverlay>(
-          col.overlay().row_map().GetIfBitVector()));
-      chain = data_layers.back()->MakeChain(std::move(chain));
-    }
-    if (col.overlay().row_map().IsRange() &&
-        col.overlay().size() != column_size) {
-      data_layers.emplace_back(std::make_unique<column::RangeOverlay>(
-          col.overlay().row_map().GetIfIRange()));
-      chain = data_layers.back()->MakeChain(std::move(chain));
-    }
-    uint32_t pre_count = rm.size();
-    FilterColumn(c, *chain, &rm);
-    PERFETTO_DCHECK(rm.size() <= pre_count);
+    FilterColumn(c, table->ChainForColumn(c.col_idx), &rm);
   }
   return rm;
 }
 
+void QueryExecutor::SortLegacy(const Table* table,
+                               const std::vector<Order>& ob,
+                               std::vector<uint32_t>& out) {
+  // Setup the sort token payload to match the input vector of indices. The
+  // value of the payload will be untouched by the algorithm even while the
+  // order changes to match the ordering defined by the input constraint set.
+  std::vector<column::DataLayerChain::SortToken> rows(out.size());
+  for (uint32_t i = 0; i < out.size(); ++i) {
+    rows[i].payload = out[i];
+  }
+
+  // As our data is columnar, it's always more efficient to sort one column
+  // at a time rather than try and sort lexiographically all at once.
+  // To preserve correctness, we need to stably sort the index vector once
+  // for each order by in *reverse* order. Reverse order is important as it
+  // preserves the lexiographical property.
+  //
+  // For example, suppose we have the following:
+  // Table {
+  //   Column x;
+  //   Column y
+  //   Column z;
+  // }
+  //
+  // Then, to sort "y asc, x desc", we could do one of two things:
+  //  1) sort the index vector all at once and on each index, we compare
+  //     y then z. This is slow as the data is columnar and we need to
+  //     repeatedly branch inside each column.
+  //  2) we can stably sort first on x desc and then sort on y asc. This will
+  //     first put all the x in the correct order such that when we sort on
+  //     y asc, we will have the correct order of x where y is the same (since
+  //     the sort is stable).
+  //
+  // TODO(lalitm): it is possible that we could sort the last constraint (i.e.
+  // the first constraint in the below loop) in a non-stable way. However, this
+  // is more subtle than it appears as we would then need special handling where
+  // there are order bys on a column which is already sorted (e.g. ts, id).
+  // Investigate whether the performance gains from this are worthwhile. This
+  // also needs changes to the constraint modification logic in DbSqliteTable
+  // which currently eliminates constraints on sorted columns.
+  for (auto it = ob.rbegin(); it != ob.rend(); ++it) {
+    // Reset the index to the payload at the start of each iote
+    for (uint32_t i = 0; i < out.size(); ++i) {
+      rows[i].index = rows[i].payload;
+    }
+    table->ChainForColumn(it->col_idx)
+        .StableSort(rows.data(), rows.data() + rows.size(),
+                    it->desc
+                        ? column::DataLayerChain::SortDirection::kDescending
+                        : column::DataLayerChain::SortDirection::kAscending);
+  }
+
+  // Recapture the payload from each of the sort tokens whose order now
+  // indicates the order
+  for (uint32_t i = 0; i < out.size(); ++i) {
+    out[i] = rows[i].payload;
+  }
+}
+
 void QueryExecutor::BoundedColumnFilterForTesting(
     const Constraint& c,
     const column::DataLayerChain& col,
diff --git a/src/trace_processor/db/query_executor.h b/src/trace_processor/db/query_executor.h
index 348c9b3..1887f1a 100644
--- a/src/trace_processor/db/query_executor.h
+++ b/src/trace_processor/db/query_executor.h
@@ -17,6 +17,7 @@
 #define SRC_TRACE_PROCESSOR_DB_QUERY_EXECUTOR_H_
 
 #include <cstdint>
+#include <utility>
 #include <vector>
 
 #include "src/trace_processor/containers/row_map.h"
@@ -49,6 +50,11 @@
   // Enables QueryExecutor::Filter on Table columns.
   static RowMap FilterLegacy(const Table*, const std::vector<Constraint>&);
 
+  // Enables QueryExecutor::Sort on Table columns.
+  static void SortLegacy(const Table*,
+                         const std::vector<Order>&,
+                         std::vector<uint32_t>&);
+
   // Used only in unittests. Exposes private function.
   static void BoundedColumnFilterForTesting(const Constraint&,
                                             const column::DataLayerChain&,
diff --git a/src/trace_processor/db/query_executor_benchmark.cc b/src/trace_processor/db/query_executor_benchmark.cc
index ea66137..fa79206 100644
--- a/src/trace_processor/db/query_executor_benchmark.cc
+++ b/src/trace_processor/db/query_executor_benchmark.cc
@@ -21,6 +21,7 @@
 #include <initializer_list>
 #include <optional>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include "perfetto/base/logging.h"
@@ -30,6 +31,7 @@
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/base/test/utils.h"
 #include "src/trace_processor/containers/string_pool.h"
+#include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/table.h"
 #include "src/trace_processor/tables/metadata_tables_py.h"
 #include "src/trace_processor/tables/profiler_tables_py.h"
@@ -47,21 +49,22 @@
 using HeapGraphObjectTable = tables::HeapGraphObjectTable;
 
 // `SELECT * FROM SLICE` on android_monitor_contention_trace.at
-static char kSliceTable[] = "test/data/slice_table_for_benchmarks.csv";
+constexpr std::string_view kSliceTable =
+    "test/data/slice_table_for_benchmarks.csv";
 
 // `SELECT * FROM SLICE` on android_monitor_contention_trace.at
-static char kExpectedFrameTimelineTable[] =
+constexpr std::string_view kExpectedFrameTimelineTable =
     "test/data/expected_frame_timeline_for_benchmarks.csv";
 
 // `SELECT id, cpu FROM raw` on chrome_android_systrace.pftrace.
-static char kRawTable[] = "test/data/raw_cpu_for_benchmarks.csv";
+constexpr std::string_view kRawTable = "test/data/raw_cpu_for_benchmarks.csv";
 
 // `SELECT id, cpu FROM ftrace_event` on chrome_android_systrace.pftrace.
-static char kFtraceEventTable[] =
+constexpr std::string_view kFtraceEventTable =
     "test/data/ftrace_event_cpu_for_benchmarks.csv";
 
 // `SELECT id, upid, reference_set_id FROM heap_graph_object` on
-static char kHeapGraphObjectTable[] =
+constexpr std::string_view kHeapGraphObjectTable =
     "test/data/heap_pgraph_object_for_benchmarks_query.csv";
 
 enum DB { V1, V2 };
@@ -88,10 +91,10 @@
 }
 
 std::vector<std::string> ReadCSV(benchmark::State& state,
-                                 std::string file_name) {
+                                 std::string_view file_name) {
   std::string table_csv;
-  perfetto::base::ReadFile(perfetto::base::GetTestDataPath(file_name),
-                           &table_csv);
+  perfetto::base::ReadFile(
+      perfetto::base::GetTestDataPath(std::string(file_name)), &table_csv);
   if (table_csv.empty()) {
     state.SkipWithError(
         "Test strings missing. Googlers: download "
@@ -225,34 +228,8 @@
   HeapGraphObjectTable table_{&pool_};
 };
 
-void BenchmarkSliceTable(benchmark::State& state,
-                         SliceTableForBenchmark& table,
-                         std::initializer_list<Constraint> c) {
-  Table::kUseFilterV2 = state.range(0) == 1;
-  for (auto _ : state) {
-    benchmark::DoNotOptimize(table.table_.QueryToRowMap(c, {}));
-  }
-  state.counters["s/row"] =
-      benchmark::Counter(static_cast<double>(table.table_.row_count()),
-                         benchmark::Counter::kIsIterationInvariantRate |
-                             benchmark::Counter::kInvert);
-}
-
-void BenchmarkExpectedFrameTable(benchmark::State& state,
-                                 ExpectedFrameTimelineTableForBenchmark& table,
-                                 Constraint c) {
-  Table::kUseFilterV2 = state.range(0) == 1;
-  for (auto _ : state) {
-    benchmark::DoNotOptimize(table.table_.QueryToRowMap({c}, {}));
-  }
-  state.counters["s/row"] =
-      benchmark::Counter(static_cast<double>(table.table_.row_count()),
-                         benchmark::Counter::kIsIterationInvariantRate |
-                             benchmark::Counter::kInvert);
-}
-
-void BenchmarkFtraceEventTable(benchmark::State& state,
-                               FtraceEventTableForBenchmark& table,
+void BenchmarkSliceTableFilter(benchmark::State& state,
+                               SliceTableForBenchmark& table,
                                std::initializer_list<Constraint> c) {
   Table::kUseFilterV2 = state.range(0) == 1;
   for (auto _ : state) {
@@ -264,93 +241,150 @@
                              benchmark::Counter::kInvert);
 }
 
+void BenchmarkSliceTableSort(benchmark::State& state,
+                             SliceTableForBenchmark& table,
+                             std::initializer_list<Order> ob) {
+  Table::kUseSortV2 = state.range(0) == 1;
+  for (auto _ : state) {
+    benchmark::DoNotOptimize(table.table_.Sort(ob));
+  }
+  state.counters["s/row"] =
+      benchmark::Counter(static_cast<double>(table.table_.row_count()),
+                         benchmark::Counter::kIsIterationInvariantRate |
+                             benchmark::Counter::kInvert);
+}
+
+void BenchmarkExpectedFrameTableFilter(
+    benchmark::State& state,
+    ExpectedFrameTimelineTableForBenchmark& table,
+    Constraint c) {
+  Table::kUseFilterV2 = state.range(0) == 1;
+  for (auto _ : state) {
+    benchmark::DoNotOptimize(table.table_.QueryToRowMap({c}, {}));
+  }
+  state.counters["s/row"] =
+      benchmark::Counter(static_cast<double>(table.table_.row_count()),
+                         benchmark::Counter::kIsIterationInvariantRate |
+                             benchmark::Counter::kInvert);
+}
+
+void BenchmarkFtraceEventTableFilter(benchmark::State& state,
+                                     FtraceEventTableForBenchmark& table,
+                                     std::initializer_list<Constraint> c) {
+  Table::kUseFilterV2 = state.range(0) == 1;
+  for (auto _ : state) {
+    benchmark::DoNotOptimize(table.table_.QueryToRowMap(c, {}));
+  }
+  state.counters["s/row"] =
+      benchmark::Counter(static_cast<double>(table.table_.row_count()),
+                         benchmark::Counter::kIsIterationInvariantRate |
+                             benchmark::Counter::kInvert);
+}
+
+void BenchmarkFtraceEventTableSort(benchmark::State& state,
+                                   FtraceEventTableForBenchmark& table,
+                                   std::initializer_list<Order> ob) {
+  Table::kUseSortV2 = state.range(0) == 1;
+  for (auto _ : state) {
+    benchmark::DoNotOptimize(table.table_.Sort(ob));
+  }
+  state.counters["s/row"] =
+      benchmark::Counter(static_cast<double>(table.table_.row_count()),
+                         benchmark::Counter::kIsIterationInvariantRate |
+                             benchmark::Counter::kInvert);
+}
+
 void BM_QESliceTableTrackIdEq(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(state, table, {table.table_.track_id().eq(100)});
+  BenchmarkSliceTableFilter(state, table, {table.table_.track_id().eq(100)});
 }
 
 BENCHMARK(BM_QESliceTableTrackIdEq)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QESliceTableParentIdIsNotNull(benchmark::State& state) {
+void BM_QESliceTableParentIdIsNotNull(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(state, table, {table.table_.parent_id().is_not_null()});
+  BenchmarkSliceTableFilter(state, table,
+                            {table.table_.parent_id().is_not_null()});
 }
 
 BENCHMARK(BM_QESliceTableParentIdIsNotNull)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QESliceTableParentIdEq(benchmark::State& state) {
+void BM_QESliceTableParentIdEq(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(state, table, {table.table_.parent_id().eq(88)});
+  BenchmarkSliceTableFilter(state, table, {table.table_.parent_id().eq(88)});
 }
 
 BENCHMARK(BM_QESliceTableParentIdEq)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QESliceTableNameEq(benchmark::State& state) {
+void BM_QESliceTableNameEq(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(state, table, {table.table_.name().eq("cheese")});
+  BenchmarkSliceTableFilter(state, table, {table.table_.name().eq("cheese")});
 }
 
 BENCHMARK(BM_QESliceTableNameEq)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QESliceTableNameGlobNoStars(benchmark::State& state) {
+void BM_QESliceTableNameGlobNoStars(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(state, table, {table.table_.name().glob("cheese")});
+  BenchmarkSliceTableFilter(state, table, {table.table_.name().glob("cheese")});
 }
 
 BENCHMARK(BM_QESliceTableNameGlobNoStars)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QESliceTableNameGlob(benchmark::State& state) {
+void BM_QESliceTableNameGlob(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(state, table, {table.table_.name().glob("chee*se")});
+  BenchmarkSliceTableFilter(state, table,
+                            {table.table_.name().glob("chee*se")});
 }
 
 BENCHMARK(BM_QESliceTableNameGlob)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QESliceTableNameRegex(benchmark::State& state) {
+void BM_QESliceTableNameRegex(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(state, table, {table.table_.name().regex(".*Pool.*")});
+  BenchmarkSliceTableFilter(state, table,
+                            {table.table_.name().regex(".*Pool.*")});
 }
 
 BENCHMARK(BM_QESliceTableNameRegex)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QESliceTableSorted(benchmark::State& state) {
+void BM_QESliceTableSorted(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(state, table, {table.table_.ts().gt(1000)});
+  BenchmarkSliceTableFilter(state, table, {table.table_.ts().gt(1000)});
 }
 
 BENCHMARK(BM_QESliceTableSorted)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QEFilterWithSparseSelector(benchmark::State& state) {
+void BM_QEFilterWithSparseSelector(benchmark::State& state) {
   ExpectedFrameTimelineTableForBenchmark table(state);
-  BenchmarkExpectedFrameTable(state, table, table.table_.track_id().eq(88));
+  BenchmarkExpectedFrameTableFilter(state, table,
+                                    table.table_.track_id().eq(88));
 }
 
 BENCHMARK(BM_QEFilterWithSparseSelector)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QEFilterWithDenseSelector(benchmark::State& state) {
+void BM_QEFilterWithDenseSelector(benchmark::State& state) {
   FtraceEventTableForBenchmark table(state);
-  BenchmarkFtraceEventTable(state, table, {table.table_.cpu().eq(4)});
+  BenchmarkFtraceEventTableFilter(state, table, {table.table_.cpu().eq(4)});
 }
 
 BENCHMARK(BM_QEFilterWithDenseSelector)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QESliceEventFilterId(benchmark::State& state) {
+void BM_QESliceEventFilterId(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(state, table, {table.table_.id().eq(500)});
+  BenchmarkSliceTableFilter(state, table, {table.table_.id().eq(500)});
 }
 
 BENCHMARK(BM_QESliceEventFilterId)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QEFtraceEventFilterId(benchmark::State& state) {
+void BM_QEFtraceEventFilterId(benchmark::State& state) {
   FtraceEventTableForBenchmark table(state);
-  BenchmarkFtraceEventTable(state, table, {table.table_.id().eq(500)});
+  BenchmarkFtraceEventTableFilter(state, table, {table.table_.id().eq(500)});
 }
 
 BENCHMARK(BM_QEFtraceEventFilterId)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QESliceTableTsAndTrackId(benchmark::State& state) {
+void BM_QESliceTableTsAndTrackId(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(
+  BenchmarkSliceTableFilter(
       state, table,
       {table.table_.ts().ge(1740530419866), table.table_.ts().le(1740530474097),
        table.table_.track_id().eq(100)});
@@ -358,15 +392,15 @@
 
 BENCHMARK(BM_QESliceTableTsAndTrackId)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QEFilterOneElement(benchmark::State& state) {
+void BM_QEFilterOneElement(benchmark::State& state) {
   SliceTableForBenchmark table(state);
-  BenchmarkSliceTable(state, table,
-                      {table.table_.id().eq(10), table.table_.dur().eq(100)});
+  BenchmarkSliceTableFilter(
+      state, table, {table.table_.id().eq(10), table.table_.dur().eq(100)});
 }
 
 BENCHMARK(BM_QEFilterOneElement)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QEFilterWithArrangement(benchmark::State& state) {
+void BM_QEFilterWithArrangement(benchmark::State& state) {
   Table::kUseFilterV2 = state.range(0) == 1;
 
   SliceTableForBenchmark table(state);
@@ -386,7 +420,7 @@
 
 BENCHMARK(BM_QEFilterWithArrangement)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QEDenseNullFilter(benchmark::State& state) {
+void BM_QEDenseNullFilter(benchmark::State& state) {
   Table::kUseFilterV2 = state.range(0) == 1;
 
   HeapGraphObjectTableForBenchmark table(state);
@@ -402,7 +436,7 @@
 }
 BENCHMARK(BM_QEDenseNullFilter)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QEDenseNullFilterIsNull(benchmark::State& state) {
+void BM_QEDenseNullFilterIsNull(benchmark::State& state) {
   Table::kUseFilterV2 = state.range(0) == 1;
 
   HeapGraphObjectTableForBenchmark table(state);
@@ -418,25 +452,25 @@
 }
 BENCHMARK(BM_QEDenseNullFilterIsNull)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QEIdColumnWithIntAsDouble(benchmark::State& state) {
+void BM_QEIdColumnWithIntAsDouble(benchmark::State& state) {
   SliceTableForBenchmark table(state);
   Constraint c{table.table_.track_id().index_in_table(), FilterOp::kEq,
                SqlValue::Double(100)};
-  BenchmarkSliceTable(state, table, {c});
+  BenchmarkSliceTableFilter(state, table, {c});
 }
 
 BENCHMARK(BM_QEIdColumnWithIntAsDouble)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QEIdColumnWithDouble(benchmark::State& state) {
+void BM_QEIdColumnWithDouble(benchmark::State& state) {
   SliceTableForBenchmark table(state);
   Constraint c{table.table_.track_id().index_in_table(), FilterOp::kEq,
                SqlValue::Double(100.5)};
-  BenchmarkSliceTable(state, table, {c});
+  BenchmarkSliceTableFilter(state, table, {c});
 }
 
 BENCHMARK(BM_QEIdColumnWithDouble)->ArgsProduct({{DB::V1, DB::V2}});
 
-static void BM_QEFilterOrderedArrangement(benchmark::State& state) {
+void BM_QEFilterOrderedArrangement(benchmark::State& state) {
   Table::kUseFilterV2 = state.range(0) == 1;
 
   SliceTableForBenchmark table(state);
@@ -456,5 +490,36 @@
 
 BENCHMARK(BM_QEFilterOrderedArrangement)->ArgsProduct({{DB::V1, DB::V2}});
 
+void BM_QESliceSortNumericAsc(benchmark::State& state) {
+  SliceTableForBenchmark table(state);
+  BenchmarkSliceTableSort(state, table, {table.table_.track_id().ascending()});
+}
+
+BENCHMARK(BM_QESliceSortNumericAsc)->ArgsProduct({{DB::V1, DB::V2}});
+
+void BM_QESliceSortNullNumericAsc(benchmark::State& state) {
+  SliceTableForBenchmark table(state);
+  BenchmarkSliceTableSort(state, table, {table.table_.parent_id().ascending()});
+}
+
+BENCHMARK(BM_QESliceSortNullNumericAsc)->ArgsProduct({{DB::V1, DB::V2}});
+
+void BM_QEFtraceEventSortSelectorNumericAsc(benchmark::State& state) {
+  FtraceEventTableForBenchmark table(state);
+  BenchmarkFtraceEventTableSort(state, table, {table.table_.cpu().ascending()});
+}
+
+BENCHMARK(BM_QEFtraceEventSortSelectorNumericAsc)
+    ->ArgsProduct({{DB::V1, DB::V2}});
+
+void BM_QEFtraceEventSortSelectorNumericDesc(benchmark::State& state) {
+  FtraceEventTableForBenchmark table(state);
+  BenchmarkFtraceEventTableSort(state, table,
+                                {table.table_.cpu().descending()});
+}
+
+BENCHMARK(BM_QEFtraceEventSortSelectorNumericDesc)
+    ->ArgsProduct({{DB::V1, DB::V2}});
+
 }  // namespace
 }  // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/query_executor_unittest.cc b/src/trace_processor/db/query_executor_unittest.cc
index 79adb06..f0d8f03 100644
--- a/src/trace_processor/db/query_executor_unittest.cc
+++ b/src/trace_processor/db/query_executor_unittest.cc
@@ -54,7 +54,8 @@
 
 TEST(QueryExecutor, OnlyStorageRange) {
   std::vector<int64_t> storage_data{1, 2, 3, 4, 5};
-  column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64);
+  column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64,
+                                          false);
   auto chain = storage.MakeChain();
 
   Constraint c{0, FilterOp::kGe, SqlValue::Long(3)};
@@ -67,7 +68,8 @@
 
 TEST(QueryExecutor, OnlyStorageRangeIsNull) {
   std::vector<int64_t> storage_data{1, 2, 3, 4, 5};
-  column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64);
+  column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64,
+                                          false);
   auto chain = storage.MakeChain();
 
   Constraint c{0, FilterOp::kIsNull, SqlValue()};
@@ -83,7 +85,8 @@
   std::iota(storage_data.begin(), storage_data.end(), 0);
   std::transform(storage_data.begin(), storage_data.end(), storage_data.begin(),
                  [](int64_t n) { return n % 5; });
-  column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64);
+  column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64,
+                                          false);
   auto chain = storage.MakeChain();
 
   Constraint c{0, FilterOp::kLt, SqlValue::Long(2)};
@@ -99,7 +102,8 @@
 
 TEST(QueryExecutor, OnlyStorageIndexIsNull) {
   std::vector<int64_t> storage_data{1, 2, 3, 4, 5};
-  column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64);
+  column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64,
+                                          false);
   auto chain = storage.MakeChain();
 
   Constraint c{0, FilterOp::kIsNull, SqlValue()};
@@ -113,7 +117,7 @@
   std::vector<int64_t> storage_data(5);
   std::iota(storage_data.begin(), storage_data.end(), 0);
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
   BitVector bv{1, 1, 0, 1, 1, 0, 0, 0, 1, 0};
   column::NullOverlay storage(&bv);
   auto chain = storage.MakeChain(numeric->MakeChain());
@@ -131,7 +135,7 @@
   std::vector<int64_t> storage_data(5);
   std::iota(storage_data.begin(), storage_data.end(), 0);
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
 
   BitVector bv{1, 1, 0, 1, 1, 0, 0, 0, 1, 0};
   column::NullOverlay storage(&bv);
@@ -155,7 +159,7 @@
   std::transform(storage_data.begin(), storage_data.end(), storage_data.begin(),
                  [](int64_t n) { return n % 3; });
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
 
   BitVector bv{1, 1, 0, 1, 1, 0, 1, 0, 0, 1};
   column::NullOverlay storage(&bv);
@@ -176,7 +180,7 @@
   std::vector<int64_t> storage_data(5);
   std::iota(storage_data.begin(), storage_data.end(), 0);
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
 
   BitVector bv{1, 1, 0, 1, 1, 0, 0, 0, 1, 0};
   column::NullOverlay storage(&bv);
@@ -198,7 +202,7 @@
   std::vector<int64_t> storage_data(5);
   std::iota(storage_data.begin(), storage_data.end(), 0);
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
 
   BitVector bv{1, 1, 0, 0, 1};
   SelectorOverlay storage(&bv);
@@ -217,7 +221,7 @@
   std::transform(storage_data.begin(), storage_data.end(), storage_data.begin(),
                  [](int64_t n) { return n % 5; });
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
 
   BitVector bv{1, 1, 0, 1, 1, 0, 1, 0, 0, 1};
   SelectorOverlay storage(&bv);
@@ -234,11 +238,10 @@
   std::vector<int64_t> storage_data(5);
   std::iota(storage_data.begin(), storage_data.end(), 0);
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
 
   std::vector<uint32_t> arrangement{4, 1, 2, 2, 3};
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
-                             false);
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
   auto chain = storage.MakeChain(numeric->MakeChain());
 
   Constraint c{0, FilterOp::kGe, SqlValue::Long(3)};
@@ -249,12 +252,11 @@
 }
 
 TEST(QueryExecutor, ArrangementOverlaySubsetInputRange) {
-  auto fake = column::FakeStorage::SearchSubset(5u, RowMap::Range(2u, 4u));
+  auto fake = column::FakeStorageChain::SearchSubset(5u, RowMap::Range(2u, 4u));
 
   std::vector<uint32_t> arrangement{4, 1, 2, 2, 3};
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
-                             false);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+  auto chain = storage.MakeChain(std::move(fake));
 
   Constraint c{0, FilterOp::kGe, SqlValue::Long(0u)};
   RowMap rm(1, 3);
@@ -264,12 +266,12 @@
 }
 
 TEST(QueryExecutor, ArrangementOverlaySubsetInputBitvector) {
-  auto fake = column::FakeStorage::SearchSubset(5u, BitVector({0, 0, 1, 1, 0}));
+  auto fake =
+      column::FakeStorageChain::SearchSubset(5u, BitVector({0, 0, 1, 1, 0}));
 
   std::vector<uint32_t> arrangement{4, 1, 2, 2, 3};
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
-                             false);
-  auto chain = storage.MakeChain(fake->MakeChain());
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+  auto chain = storage.MakeChain(std::move(fake));
 
   Constraint c{0, FilterOp::kGe, SqlValue::Long(0u)};
   RowMap rm(1, 3);
@@ -282,11 +284,10 @@
   std::vector<int64_t> storage_data(5);
   std::iota(storage_data.begin(), storage_data.end(), 0);
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
 
   std::vector<uint32_t> arrangement{4, 1, 2, 2, 3};
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
-                             false);
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
   auto chain = storage.MakeChain(numeric->MakeChain());
 
   Constraint c{0, FilterOp::kGe, SqlValue::Long(3)};
@@ -298,7 +299,8 @@
 
 TEST(QueryExecutor, MismatchedTypeNullWithOtherOperations) {
   std::vector<int64_t> storage_data{0, 1, 2, 3, 0, 1, 2, 3};
-  column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64);
+  column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64,
+                                          false);
   auto chain = storage.MakeChain();
 
   // Filter.
@@ -312,7 +314,7 @@
 TEST(QueryExecutor, SingleConstraintWithNullAndSelector) {
   std::vector<int64_t> storage_data{0, 1, 2, 3, 0, 1, 2, 3};
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
 
   // Current vector
   // 0, 1, NULL, 2, 3, 0, NULL, NULL, 1, 2, 3, NULL
@@ -338,7 +340,7 @@
 TEST(QueryExecutor, SingleConstraintWithNullAndArrangement) {
   std::vector<int64_t> storage_data{0, 1, 2, 3, 0, 1, 2, 3};
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
 
   // Current vector
   // 0, 1, NULL, 2, 3, 0, NULL, NULL, 1, 2, 3, NULL
@@ -348,8 +350,7 @@
   // Final vector
   // NULL, 3, NULL, NULL, 3, NULL
   std::vector<uint32_t> arrangement{2, 4, 6, 2, 4, 6};
-  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
-                             false);
+  ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
   auto chain = storage.MakeChain(null->MakeChain(numeric->MakeChain()));
 
   // Filter.
@@ -365,7 +366,7 @@
 TEST(QueryExecutor, IsNullWithSelector) {
   std::vector<int64_t> storage_data{0, 1, 2, 3, 0, 1, 2, 3};
   auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
-      &storage_data, ColumnType::kInt64);
+      &storage_data, ColumnType::kInt64, false);
 
   // Current vector
   // 0, 1, NULL, 2, 3, 0, NULL, NULL, 1, 2, 3, NULL
diff --git a/src/trace_processor/db/runtime_table.cc b/src/trace_processor/db/runtime_table.cc
index 123cc16..38938b8 100644
--- a/src/trace_processor/db/runtime_table.cc
+++ b/src/trace_processor/db/runtime_table.cc
@@ -29,8 +29,15 @@
 #include "perfetto/base/logging.h"
 #include "perfetto/base/status.h"
 #include "perfetto/ext/base/status_or.h"
+#include "perfetto/trace_processor/ref_counted.h"
 #include "src/trace_processor/containers/string_pool.h"
 #include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/id_storage.h"
+#include "src/trace_processor/db/column/null_overlay.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
+#include "src/trace_processor/db/column/string_storage.h"
+#include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column_storage_overlay.h"
 
 namespace perfetto::trace_processor {
@@ -57,12 +64,17 @@
 
 }  // namespace
 
-RuntimeTable::RuntimeTable(StringPool* pool,
-                           uint32_t row_count,
-                           std::vector<ColumnLegacy> columns,
-                           std::vector<ColumnStorageOverlay> overlays)
+RuntimeTable::RuntimeTable(
+    StringPool* pool,
+    uint32_t row_count,
+    std::vector<ColumnLegacy> columns,
+    std::vector<ColumnStorageOverlay> overlays,
+    std::vector<RefPtr<column::DataLayer>> storage_layers,
+    std::vector<RefPtr<column::DataLayer>> null_layers,
+    std::vector<RefPtr<column::DataLayer>> overlay_layers)
     : Table(pool, row_count, std::move(columns), std::move(overlays)) {
-  OnConstructionCompleted();
+  OnConstructionCompleted(std::move(storage_layers), std::move(null_layers),
+                          std::move(overlay_layers));
 }
 
 RuntimeTable::~RuntimeTable() = default;
@@ -165,9 +177,12 @@
 
 base::StatusOr<std::unique_ptr<RuntimeTable>> RuntimeTable::Builder::Build(
     uint32_t rows) && {
+  std::vector<RefPtr<column::DataLayer>> storage_layers(col_names_.size() + 1);
+  std::vector<RefPtr<column::DataLayer>> null_layers(col_names_.size() + 1);
   std::vector<ColumnLegacy> columns;
   for (uint32_t i = 0; i < col_names_.size(); ++i) {
     auto* col = storage_[i].get();
+    std::unique_ptr<column::DataLayerChain> chain;
     PERFETTO_DCHECK(IsStorageNotIntNorDouble(*col));
     if (auto* leading_nulls = std::get_if<uint32_t>(col)) {
       PERFETTO_CHECK(*leading_nulls == rows);
@@ -185,14 +200,22 @@
                                          ColumnLegacy::Flag::kSorted
                                    : ColumnLegacy::Flag::kNonNull;
         columns.emplace_back(col_names_[i].c_str(), non_null_ints, flags, i, 0);
+        storage_layers[i].reset(new column::NumericStorage<int64_t>(
+            &non_null_ints->vector(), ColumnType::kInt64, is_sorted));
       } else {
         columns.emplace_back(col_names_[i].c_str(), ints,
                              ColumnLegacy::Flag::kNoFlag, i, 0);
+        storage_layers[i].reset(new column::NumericStorage<int64_t>(
+            &ints->non_null_vector(), ColumnType::kInt64, false));
+        null_layers[i].reset(
+            new column::NullOverlay(&ints->non_null_bit_vector()));
       }
     } else if (auto* strings = std::get_if<StringStorage>(col)) {
       PERFETTO_CHECK(strings->size() == rows);
       columns.emplace_back(col_names_[i].c_str(), strings,
                            ColumnLegacy::Flag::kNonNull, i, 0);
+      storage_layers[i].reset(
+          new column::StringStorage(string_pool_, &strings->vector()));
     } else if (auto* doubles = std::get_if<NullDoubleStorage>(col)) {
       PERFETTO_CHECK(doubles->size() == rows);
       // Check if the column is nullable.
@@ -207,9 +230,15 @@
                                    : ColumnLegacy::Flag::kNonNull;
         columns.emplace_back(col_names_[i].c_str(), non_null_doubles, flags, i,
                              0);
+        storage_layers[i].reset(new column::NumericStorage<double>(
+            &non_null_doubles->vector(), ColumnType::kDouble, is_sorted));
       } else {
         columns.emplace_back(col_names_[i].c_str(), doubles,
                              ColumnLegacy::Flag::kNoFlag, i, 0);
+        storage_layers[i].reset(new column::NumericStorage<double>(
+            &doubles->non_null_vector(), ColumnType::kDouble, false));
+        null_layers[i].reset(
+            new column::NullOverlay(&doubles->non_null_bit_vector()));
       }
     } else {
       PERFETTO_FATAL("Unexpected column type");
@@ -218,12 +247,17 @@
   columns.push_back(ColumnLegacy::IdColumn(
       static_cast<uint32_t>(columns.size()), 0, "_auto_id",
       ColumnLegacy::kIdFlags | ColumnLegacy::Flag::kHidden));
+  storage_layers.back().reset(new column::IdStorage());
 
   std::vector<ColumnStorageOverlay> overlays;
   overlays.emplace_back(rows);
 
+  std::vector<RefPtr<column::DataLayer>> overlay_layers(1);
+
   auto table = std::make_unique<RuntimeTable>(
-      string_pool_, rows, std::move(columns), std::move(overlays));
+      string_pool_, rows, std::move(columns), std::move(overlays),
+      std::move(storage_layers), std::move(null_layers),
+      std::move(overlay_layers));
   table->storage_ = std::move(storage_);
   table->col_names_ = std::move(col_names_);
 
diff --git a/src/trace_processor/db/runtime_table.h b/src/trace_processor/db/runtime_table.h
index c6fe87e..9fea3d9 100644
--- a/src/trace_processor/db/runtime_table.h
+++ b/src/trace_processor/db/runtime_table.h
@@ -26,8 +26,10 @@
 
 #include "perfetto/base/status.h"
 #include "perfetto/ext/base/status_or.h"
+#include "perfetto/trace_processor/ref_counted.h"
 #include "src/trace_processor/containers/string_pool.h"
 #include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/column/data_layer.h"
 #include "src/trace_processor/db/column_storage.h"
 #include "src/trace_processor/db/column_storage_overlay.h"
 #include "src/trace_processor/db/table.h"
@@ -69,7 +71,10 @@
   explicit RuntimeTable(StringPool*,
                         uint32_t row_count,
                         std::vector<ColumnLegacy>,
-                        std::vector<ColumnStorageOverlay>);
+                        std::vector<ColumnStorageOverlay>,
+                        std::vector<RefPtr<column::DataLayer>> storage_layers,
+                        std::vector<RefPtr<column::DataLayer>> null_layers,
+                        std::vector<RefPtr<column::DataLayer>> overlay_layers);
   ~RuntimeTable() override;
 
   RuntimeTable(RuntimeTable&&) = default;
diff --git a/src/trace_processor/db/table.cc b/src/trace_processor/db/table.cc
index 9171bcc..964e567 100644
--- a/src/trace_processor/db/table.cc
+++ b/src/trace_processor/db/table.cc
@@ -18,19 +18,28 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <memory>
 #include <utility>
 #include <vector>
 
 #include "perfetto/base/logging.h"
+#include "perfetto/public/compiler.h"
+#include "perfetto/trace_processor/ref_counted.h"
 #include "src/trace_processor/containers/row_map.h"
 #include "src/trace_processor/containers/string_pool.h"
 #include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/column/arrangement_overlay.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/range_overlay.h"
+#include "src/trace_processor/db/column/selector_overlay.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column_storage_overlay.h"
+#include "src/trace_processor/db/query_executor.h"
 
 namespace perfetto::trace_processor {
 
 bool Table::kUseFilterV2 = true;
+bool Table::kUseSortV2 = false;
 
 Table::Table(StringPool* pool,
              uint32_t row_count,
@@ -51,6 +60,12 @@
 
   overlays_ = std::move(other.overlays_);
   columns_ = std::move(other.columns_);
+
+  storage_layers_ = std::move(other.storage_layers_);
+  null_layers_ = std::move(other.null_layers_);
+  overlay_layers_ = std::move(other.overlay_layers_);
+  chains_ = std::move(other.chains_);
+
   for (ColumnLegacy& col : columns_) {
     col.table_ = this;
   }
@@ -62,7 +77,7 @@
   for (const ColumnStorageOverlay& overlay : overlays_) {
     table.overlays_.emplace_back(overlay.Copy());
   }
-  table.OnConstructionCompleted();
+  table.OnConstructionCompleted(storage_layers_, null_layers_, overlay_layers_);
   return table;
 }
 
@@ -78,6 +93,18 @@
 RowMap Table::QueryToRowMap(const std::vector<Constraint>& cs,
                             const std::vector<Order>& ob,
                             RowMap::OptimizeFor optimize_for) const {
+  // We need to delay creation of the chains to this point because of Chrome
+  // does not want the binary size overhead of including the chain
+  // implementations. As they also don't query tables (instead just iterating)
+  // over them), using a combination of dead code elimination and linker
+  // stripping all chain related code be removed.
+  //
+  // From rough benchmarking, this has a negligible impact on peformance as this
+  // branch is almost never taken.
+  if (PERFETTO_UNLIKELY(chains_.size() != columns_.size())) {
+    CreateChains();
+  }
+
   RowMap rm = FilterToRowMap(cs, optimize_for);
   if (ob.empty())
     return rm;
@@ -128,8 +155,12 @@
     // worthwhile. This also needs changes to the constraint modification logic
     // in DbSqliteTable which currently eliminates constraints on sorted
     // columns.
-    for (auto it = ob.rbegin(); it != ob.rend(); ++it) {
-      columns_[it->col_idx].StableSort(it->desc, &idx);
+    if (Table::kUseSortV2) {
+      QueryExecutor::SortLegacy(this, ob, idx);
+    } else {
+      for (auto it = ob.rbegin(); it != ob.rend(); ++it) {
+        columns_[it->col_idx].StableSort(it->desc, &idx);
+      }
     }
   }
   return RowMap(std::move(idx));
@@ -148,7 +179,6 @@
     table.overlays_.emplace_back(overlay.SelectRows(rm));
     PERFETTO_DCHECK(table.overlays_.back().size() == table.row_count());
   }
-  table.OnConstructionCompleted();
 
   // Remove the sorted and row set flags from all the columns.
   for (auto& col : table.columns_) {
@@ -161,7 +191,55 @@
   if (!ob.front().desc) {
     table.columns_[ob.front().col_idx].flags_ |= ColumnLegacy::Flag::kSorted;
   }
+
+  std::vector<RefPtr<column::DataLayer>> overlay_layers(table.overlays_.size());
+  for (uint32_t i = 0; i < table.overlays_.size(); ++i) {
+    if (table.overlays_[i].row_map().IsIndexVector()) {
+      overlay_layers[i].reset(new column::ArrangementOverlay(
+          table.overlays_[i].row_map().GetIfIndexVector(),
+          Indices::State::kNonmonotonic));
+    } else if (table.overlays_[i].row_map().IsBitVector()) {
+      overlay_layers[i].reset(new column::SelectorOverlay(
+          table.overlays_[i].row_map().GetIfBitVector()));
+    } else if (table.overlays_[i].row_map().IsRange()) {
+      overlay_layers[i].reset(
+          new column::RangeOverlay(table.overlays_[i].row_map().GetIfIRange()));
+    }
+  }
+  table.OnConstructionCompleted(storage_layers_, null_layers_,
+                                std::move(overlay_layers));
   return table;
 }
 
+void Table::OnConstructionCompleted(
+    std::vector<RefPtr<column::DataLayer>> storage_layers,
+    std::vector<RefPtr<column::DataLayer>> null_layers,
+    std::vector<RefPtr<column::DataLayer>> overlay_layers) {
+  for (ColumnLegacy& col : columns_) {
+    col.BindToTable(this, string_pool_);
+  }
+  PERFETTO_CHECK(storage_layers.size() == columns_.size());
+  PERFETTO_CHECK(null_layers.size() == columns_.size());
+  PERFETTO_CHECK(overlay_layers.size() == overlays_.size());
+  storage_layers_ = std::move(storage_layers);
+  null_layers_ = std::move(null_layers);
+  overlay_layers_ = std::move(overlay_layers);
+}
+
+void Table::CreateChains() const {
+  chains_.resize(columns_.size());
+  for (uint32_t i = 0; i < columns_.size(); ++i) {
+    chains_[i] = storage_layers_[i]->MakeChain();
+    if (const auto& null_overlay = null_layers_[i]; null_overlay.get()) {
+      chains_[i] = null_overlay->MakeChain(std::move(chains_[i]));
+    }
+    const auto& oly_idx = columns_[i].overlay_index();
+    if (const auto& overlay = overlay_layers_[oly_idx]; overlay.get()) {
+      chains_[i] = overlay->MakeChain(
+          std::move(chains_[i]),
+          column::DataLayer::ChainCreationArgs{columns_[i].IsSorted()});
+    }
+  }
+}
+
 }  // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/table.h b/src/trace_processor/db/table.h
index dc59644..5e8a583 100644
--- a/src/trace_processor/db/table.h
+++ b/src/trace_processor/db/table.h
@@ -18,15 +18,19 @@
 #define SRC_TRACE_PROCESSOR_DB_TABLE_H_
 
 #include <cstdint>
+#include <memory>
 #include <string>
 #include <utility>
 #include <vector>
 
+#include "perfetto/base/compiler.h"
 #include "perfetto/base/logging.h"
 #include "perfetto/trace_processor/basic_types.h"
+#include "perfetto/trace_processor/ref_counted.h"
 #include "src/trace_processor/containers/row_map.h"
 #include "src/trace_processor/containers/string_pool.h"
 #include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/column/data_layer.h"
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/column_storage_overlay.h"
 #include "src/trace_processor/db/query_executor.h"
@@ -115,6 +119,7 @@
   };
 
   static bool kUseFilterV2;
+  static bool kUseSortV2;
 
   virtual ~Table();
 
@@ -123,6 +128,11 @@
   Table(Table&& other) noexcept { *this = std::move(other); }
   Table& operator=(Table&& other) noexcept;
 
+  // Return a chain corresponding to a given column.
+  const column::DataLayerChain& ChainForColumn(uint32_t col_idx) const {
+    return *chains_[col_idx];
+  }
+
   // Filters and sorts the tables with the arguments specified, returning the
   // result as a RowMap.
   RowMap QueryToRowMap(
@@ -148,6 +158,12 @@
   uint32_t row_count() const { return row_count_; }
   StringPool* string_pool() const { return string_pool_; }
   const std::vector<ColumnLegacy>& columns() const { return columns_; }
+  const std::vector<RefPtr<column::DataLayer>>& storage_layers() const {
+    return storage_layers_;
+  }
+  const std::vector<RefPtr<column::DataLayer>>& null_layers() const {
+    return null_layers_;
+  }
 
  protected:
   Table(StringPool*,
@@ -172,11 +188,10 @@
     overlays_.back().Insert(row_count_++);
   }
 
-  void OnConstructionCompleted() {
-    for (ColumnLegacy& col : columns_) {
-      col.BindToTable(this, string_pool_);
-    }
-  }
+  void OnConstructionCompleted(
+      std::vector<RefPtr<column::DataLayer>> storage_layers,
+      std::vector<RefPtr<column::DataLayer>> null_layers,
+      std::vector<RefPtr<column::DataLayer>> overlay_layers);
 
   ColumnLegacy* GetColumn(uint32_t index) { return &columns_[index]; }
 
@@ -187,7 +202,7 @@
  private:
   friend class ColumnLegacy;
 
-  RowMap FilterToRowMap(
+  PERFETTO_ALWAYS_INLINE RowMap FilterToRowMap(
       const std::vector<Constraint>& cs,
       RowMap::OptimizeFor optimize_for = RowMap::OptimizeFor::kMemory) const {
     if (cs.empty()) {
@@ -207,12 +222,19 @@
     return rm;
   }
 
+  void CreateChains() const;
+
   Table CopyExceptOverlays() const;
 
   StringPool* string_pool_ = nullptr;
   uint32_t row_count_ = 0;
   std::vector<ColumnStorageOverlay> overlays_;
   std::vector<ColumnLegacy> columns_;
+
+  std::vector<RefPtr<column::DataLayer>> storage_layers_;
+  std::vector<RefPtr<column::DataLayer>> null_layers_;
+  std::vector<RefPtr<column::DataLayer>> overlay_layers_;
+  mutable std::vector<std::unique_ptr<column::DataLayerChain>> chains_;
 };
 
 }  // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/typed_column.h b/src/trace_processor/db/typed_column.h
index 3afcc38..1f6c280 100644
--- a/src/trace_processor/db/typed_column.h
+++ b/src/trace_processor/db/typed_column.h
@@ -67,6 +67,8 @@
   // (handling ids would add an extra type to consider when filtering for no
   // benefit.
   using stored_type = typename TH::stored_type;
+  using non_optional_stored_type =
+      typename tc_internal::TypeHandler<non_optional_type>::stored_type;
 
  private:
   using Serializer = tc_internal::Serializer<non_optional_type>;
@@ -123,7 +125,7 @@
   }
 
   // Converts the static type T into the dynamic SqlValue type of this column.
-  static SqlValue::Type SqlValueType() {
+  static constexpr SqlValue::Type SqlValueType() {
     return ColumnLegacy::ToSqlValueType<stored_type>();
   }
 
diff --git a/src/trace_processor/importers/common/BUILD.gn b/src/trace_processor/importers/common/BUILD.gn
index 2804a0b..dac6e41 100644
--- a/src/trace_processor/importers/common/BUILD.gn
+++ b/src/trace_processor/importers/common/BUILD.gn
@@ -44,8 +44,6 @@
     "slice_tracker.h",
     "slice_translation_table.cc",
     "slice_translation_table.h",
-    "stack_profile_tracker.cc",
-    "stack_profile_tracker.h",
     "system_info_tracker.cc",
     "system_info_tracker.h",
     "trace_parser.cc",
@@ -66,11 +64,9 @@
     "../../../../protos/perfetto/trace:zero",
     "../../../../protos/perfetto/trace/profiling:zero",
     "../../../base",
-    "../../db",
+    "../../db:minimal",
     "../../storage",
-    "../../tables:tables",
     "../../types",
-    "../../util:stack_traces_util",
     "../fuchsia:fuchsia_record",
     "../systrace:systrace_line",
   ]
diff --git a/src/trace_processor/importers/common/stack_profile_tracker.cc b/src/trace_processor/importers/common/stack_profile_tracker.cc
deleted file mode 100644
index ad57523..0000000
--- a/src/trace_processor/importers/common/stack_profile_tracker.cc
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2019 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.
- */
-
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
-
-#include "perfetto/ext/base/string_utils.h"
-#include "perfetto/ext/base/string_view.h"
-#include "src/trace_processor/storage/trace_storage.h"
-#include "src/trace_processor/tables/profiler_tables_py.h"
-#include "src/trace_processor/types/trace_processor_context.h"
-#include "src/trace_processor/util/profiler_util.h"
-#include "src/trace_processor/util/stack_traces_util.h"
-
-namespace perfetto {
-namespace trace_processor {
-
-namespace {
-std::string CleanBuildId(base::StringView build_id) {
-  if (build_id.empty()) {
-    return build_id.ToStdString();
-  }
-  // If the build_id is 33 characters long, we assume it's a Breakpad debug
-  // identifier which is already in Hex and doesn't need conversion.
-  // TODO(b/148109467): Remove workaround once all active Chrome versions
-  // write raw bytes instead of a string as build_id.
-  if (util::IsHexModuleId(build_id)) {
-    return build_id.ToStdString();
-  }
-
-  return base::ToHex(build_id.data(), build_id.size());
-}
-
-}  // namespace
-
-std::vector<FrameId> StackProfileTracker::JavaFramesForName(
-    NameInPackage name) const {
-  if (const auto* frames = java_frames_for_name_.Find(name); frames) {
-    return *frames;
-  }
-  return {};
-}
-
-std::vector<MappingId> StackProfileTracker::FindMappingRow(
-    StringId name,
-    StringId build_id) const {
-  if (const auto* mappings =
-          mappings_by_name_and_build_id_.Find(std::make_pair(name, build_id));
-      mappings) {
-    return *mappings;
-  }
-  return {};
-}
-
-std::vector<FrameId> StackProfileTracker::FindFrameIds(MappingId mapping_id,
-                                                       uint64_t rel_pc) const {
-  if (const auto* frames =
-          frame_by_mapping_and_rel_pc_.Find(std::make_pair(mapping_id, rel_pc));
-      frames) {
-    return *frames;
-  }
-  return {};
-}
-
-MappingId StackProfileTracker::InternMapping(
-    const CreateMappingParams& params) {
-  tables::StackProfileMappingTable::Row row;
-  row.build_id = InternBuildId(params.build_id);
-  row.exact_offset = static_cast<int64_t>(params.exact_offset);
-  row.start_offset = static_cast<int64_t>(params.start_offset);
-  row.start = static_cast<int64_t>(params.start);
-  row.end = static_cast<int64_t>(params.end);
-  row.load_bias = static_cast<int64_t>(params.load_bias);
-  row.name = context_->storage->InternString(params.name);
-
-  if (MappingId* id = mapping_unique_row_index_.Find(row); id) {
-    return *id;
-  }
-
-  MappingId mapping_id =
-      context_->storage->mutable_stack_profile_mapping_table()->Insert(row).id;
-  mapping_unique_row_index_.Insert(row, mapping_id);
-  mappings_by_name_and_build_id_[{row.name, row.build_id}].push_back(
-      mapping_id);
-  return mapping_id;
-}
-
-CallsiteId StackProfileTracker::InternCallsite(
-    std::optional<CallsiteId> parent_callsite_id,
-    FrameId frame_id,
-    uint32_t depth) {
-  tables::StackProfileCallsiteTable::Row row{depth, parent_callsite_id,
-                                             frame_id};
-  if (CallsiteId* id = callsite_unique_row_index_.Find(row); id) {
-    return *id;
-  }
-
-  CallsiteId callsite_id =
-      context_->storage->mutable_stack_profile_callsite_table()->Insert(row).id;
-  callsite_unique_row_index_.Insert(row, callsite_id);
-  return callsite_id;
-}
-
-FrameId StackProfileTracker::InternFrame(MappingId mapping_id,
-                                         uint64_t rel_pc,
-                                         base::StringView function_name) {
-  tables::StackProfileFrameTable::Row row;
-  row.mapping = mapping_id;
-  row.rel_pc = static_cast<int64_t>(rel_pc);
-  row.name = context_->storage->InternString(function_name);
-
-  if (FrameId* id = frame_unique_row_index_.Find(row); id) {
-    return *id;
-  }
-
-  FrameId frame_id =
-      context_->storage->mutable_stack_profile_frame_table()->Insert(row).id;
-  frame_unique_row_index_.Insert(row, frame_id);
-  frame_by_mapping_and_rel_pc_[{mapping_id, rel_pc}].push_back(frame_id);
-
-  if (function_name.find('.') != base::StringView::npos) {
-    // Java frames always contain a '.'
-    base::StringView mapping_name = context_->storage->GetString(
-        context_->storage->stack_profile_mapping_table()
-            .FindById(mapping_id)
-            ->name());
-    std::optional<std::string> package =
-        PackageFromLocation(context_->storage.get(), mapping_name);
-    if (package) {
-      NameInPackage nip{row.name, context_->storage->InternString(
-                                      base::StringView(*package))};
-      java_frames_for_name_[nip].push_back(frame_id);
-    } else if (mapping_name.find("/memfd:") == 0) {
-      NameInPackage nip{row.name, context_->storage->InternString("memfd")};
-      java_frames_for_name_[nip].push_back(frame_id);
-    }
-  }
-
-  return frame_id;
-}
-
-StringId StackProfileTracker::InternBuildId(base::StringView build_id) {
-  return context_->storage->InternString(
-      base::StringView(CleanBuildId(build_id)));
-}
-
-}  // namespace trace_processor
-}  // namespace perfetto
diff --git a/src/trace_processor/importers/common/stack_profile_tracker.h b/src/trace_processor/importers/common/stack_profile_tracker.h
deleted file mode 100644
index a1067b8..0000000
--- a/src/trace_processor/importers/common/stack_profile_tracker.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2019 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.
- */
-
-#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_STACK_PROFILE_TRACKER_H_
-#define SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_STACK_PROFILE_TRACKER_H_
-
-#include <cstdint>
-#include <optional>
-#include <tuple>
-#include <utility>
-#include <vector>
-
-#include "perfetto/ext/base/flat_hash_map.h"
-#include "perfetto/ext/base/hash.h"
-#include "perfetto/ext/base/string_view.h"
-#include "src/trace_processor/storage/trace_storage.h"
-#include "src/trace_processor/tables/profiler_tables_py.h"
-
-namespace perfetto {
-namespace trace_processor {
-
-struct NameInPackage {
-  StringId name;
-  StringId package;
-
-  bool operator==(const NameInPackage& b) const {
-    return std::tie(name, package) == std::tie(b.name, b.package);
-  }
-
-  struct Hasher {
-    size_t operator()(const NameInPackage& o) const {
-      return static_cast<size_t>(
-          base::Hasher::Combine(o.name.raw_id(), o.package.raw_id()));
-    }
-  };
-};
-
-class TraceProcessorContext;
-
-class StackProfileTracker {
- public:
-  struct CreateMappingParams {
-    base::StringView build_id;
-    uint64_t exact_offset;
-    uint64_t start_offset;
-    uint64_t start;
-    uint64_t end;
-    uint64_t load_bias;
-    base::StringView name;
-  };
-
-  explicit StackProfileTracker(TraceProcessorContext* context)
-      : context_(context) {}
-
-  std::vector<FrameId> JavaFramesForName(NameInPackage name) const;
-  std::vector<MappingId> FindMappingRow(StringId name, StringId build_id) const;
-  std::vector<FrameId> FindFrameIds(MappingId mapping_id,
-                                    uint64_t rel_pc) const;
-
-  MappingId InternMapping(const CreateMappingParams& params);
-  CallsiteId InternCallsite(std::optional<CallsiteId> parent_callsite_id,
-                            FrameId frame_id,
-                            uint32_t depth);
-  FrameId InternFrame(MappingId mapping_id,
-                      uint64_t rel_pc,
-                      base::StringView function_name);
-
- private:
-  StringId InternBuildId(base::StringView build_id);
-
-  TraceProcessorContext* const context_;
-  base::FlatHashMap<tables::StackProfileMappingTable::Row, MappingId>
-      mapping_unique_row_index_;
-  base::FlatHashMap<tables::StackProfileCallsiteTable::Row, CallsiteId>
-      callsite_unique_row_index_;
-  base::FlatHashMap<tables::StackProfileFrameTable::Row, FrameId>
-      frame_unique_row_index_;
-
-  struct MappingHasher {
-    size_t operator()(const std::pair<StringId, StringId>& o) const {
-      return static_cast<size_t>(
-          base::Hasher::Combine(o.first.raw_id(), o.second.raw_id()));
-    }
-  };
-  base::FlatHashMap<std::pair<StringId, StringId>,
-                    std::vector<MappingId>,
-                    MappingHasher>
-      mappings_by_name_and_build_id_;
-
-  struct FrameHasher {
-    size_t operator()(const std::pair<MappingId, uint64_t>& o) const {
-      return static_cast<size_t>(
-          base::Hasher::Combine(o.first.value, o.second));
-    }
-  };
-  base::FlatHashMap<std::pair<MappingId, uint64_t>,
-                    std::vector<FrameId>,
-                    FrameHasher>
-      frame_by_mapping_and_rel_pc_;
-
-  base::FlatHashMap<NameInPackage, std::vector<FrameId>, NameInPackage::Hasher>
-      java_frames_for_name_;
-};
-
-}  // namespace trace_processor
-}  // namespace perfetto
-
-#endif  // SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_STACK_PROFILE_TRACKER_H_
diff --git a/src/trace_processor/importers/ftrace/BUILD.gn b/src/trace_processor/importers/ftrace/BUILD.gn
index c618978..8065a41 100644
--- a/src/trace_processor/importers/ftrace/BUILD.gn
+++ b/src/trace_processor/importers/ftrace/BUILD.gn
@@ -68,7 +68,6 @@
     "../../../../protos/perfetto/trace:zero",
     "../../../../protos/perfetto/trace/ftrace:zero",
     "../../../../protos/perfetto/trace/interned_data:zero",
-    "../../../../protos/perfetto/trace/profiling:zero",
     "../../../protozero",
     "../../sorter",
     "../../storage",
@@ -77,7 +76,6 @@
     "../common:parser_types",
     "../i2c:full",
     "../proto:minimal",
-    "../proto:packet_sequence_state_generation_hdr",
     "../syscalls:full",
     "../systrace:systrace_parser",
   ]
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.cc b/src/trace_processor/importers/ftrace/ftrace_parser.cc
index 951c03d..cfed1d1 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.cc
@@ -32,7 +32,7 @@
 #include "src/trace_processor/importers/ftrace/v4l2_tracker.h"
 #include "src/trace_processor/importers/ftrace/virtio_video_tracker.h"
 #include "src/trace_processor/importers/i2c/i2c_tracker.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
+#include "src/trace_processor/importers/proto/packet_sequence_state.h"
 #include "src/trace_processor/importers/syscalls/syscall_tracker.h"
 #include "src/trace_processor/importers/systrace/systrace_parser.h"
 #include "src/trace_processor/storage/stats.h"
@@ -85,7 +85,6 @@
 #include "protos/perfetto/trace/ftrace/vmscan.pbzero.h"
 #include "protos/perfetto/trace/ftrace/workqueue.pbzero.h"
 #include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
-#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
 
 namespace perfetto {
 namespace trace_processor {
diff --git a/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc b/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc
index 8e72751..429cfce 100644
--- a/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc
@@ -120,6 +120,13 @@
         cpu, kMaxCpuCount);
   }
 
+  if (PERFETTO_UNLIKELY(decoder.lost_events())) {
+    // If set, it means that the kernel overwrote an unspecified number of
+    // events since our last read from the per-cpu buffer.
+    context_->storage->SetIndexedStats(stats::ftrace_cpu_has_data_loss,
+                                       static_cast<int>(cpu), 1);
+  }
+
   ClockTracker::ClockId clock_id;
   switch (decoder.ftrace_clock()) {
     case FtraceClock::FTRACE_CLOCK_UNSPECIFIED:
diff --git a/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc b/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc
index d644742..e61a137 100644
--- a/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc
+++ b/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc
@@ -29,12 +29,12 @@
 #include "src/trace_processor/importers/common/metadata_tracker.h"
 #include "src/trace_processor/importers/common/process_tracker.h"
 #include "src/trace_processor/importers/common/slice_tracker.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
 #include "src/trace_processor/importers/common/track_tracker.h"
 #include "src/trace_processor/importers/ftrace/sched_event_tracker.h"
 #include "src/trace_processor/importers/proto/additional_modules.h"
 #include "src/trace_processor/importers/proto/default_modules.h"
 #include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
 #include "src/trace_processor/sorter/trace_sorter.h"
 #include "src/trace_processor/storage/metadata.h"
 #include "src/trace_processor/storage/trace_storage.h"
@@ -236,7 +236,8 @@
     context_.track_tracker.reset(new TrackTracker(&context_));
     context_.global_args_tracker.reset(
         new GlobalArgsTracker(context_.storage.get()));
-    context_.stack_profile_tracker.reset(new StackProfileTracker(&context_));
+    context_.global_stack_profile_tracker.reset(
+        new GlobalStackProfileTracker());
     context_.args_tracker.reset(new ArgsTracker(&context_));
     context_.args_translation_table.reset(new ArgsTranslationTable(storage_));
     context_.metadata_tracker.reset(
diff --git a/src/trace_processor/importers/proto/BUILD.gn b/src/trace_processor/importers/proto/BUILD.gn
index 891e1de..a901ae1 100644
--- a/src/trace_processor/importers/proto/BUILD.gn
+++ b/src/trace_processor/importers/proto/BUILD.gn
@@ -26,6 +26,8 @@
     "chrome_system_probes_parser.h",
     "default_modules.cc",
     "default_modules.h",
+    "heap_profile_tracker.cc",
+    "heap_profile_tracker.h",
     "memory_tracker_snapshot_module.cc",
     "memory_tracker_snapshot_module.h",
     "memory_tracker_snapshot_parser.cc",
@@ -42,10 +44,10 @@
     "perf_sample_tracker.h",
     "profile_module.cc",
     "profile_module.h",
-    "profile_packet_sequence_state.cc",
-    "profile_packet_sequence_state.h",
     "profile_packet_utils.cc",
     "profile_packet_utils.h",
+    "profiler_util.cc",
+    "profiler_util.h",
     "proto_incremental_state.h",
     "proto_trace_parser.cc",
     "proto_trace_parser.h",
@@ -53,8 +55,8 @@
     "proto_trace_reader.h",
     "proto_trace_tokenizer.cc",
     "proto_trace_tokenizer.h",
-    "stack_profile_sequence_state.cc",
-    "stack_profile_sequence_state.h",
+    "stack_profile_tracker.cc",
+    "stack_profile_tracker.h",
     "track_event_module.cc",
     "track_event_module.h",
     "track_event_parser.cc",
@@ -153,7 +155,6 @@
     ":gen_cc_statsd_atoms_descriptor",
     ":gen_cc_trace_descriptor",
     ":minimal",
-    ":packet_sequence_state_generation_hdr",
     "../../../../gn:default_deps",
     "../../../../include/perfetto/ext/traced:sys_stats_counters",
     "../../../../protos/perfetto/common:zero",
@@ -179,7 +180,6 @@
     "../../util:descriptors",
     "../../util:proto_profiler",
     "../../util:proto_to_args_parser",
-    "../../util:stack_traces_util",
     "../common",
     "../common:parser_types",
     "../etw:full",
@@ -243,9 +243,9 @@
   sources = [
     "active_chrome_processes_tracker_unittest.cc",
     "heap_graph_tracker_unittest.cc",
+    "heap_profile_tracker_unittest.cc",
     "network_trace_module_unittest.cc",
     "perf_sample_tracker_unittest.cc",
-    "profile_packet_sequence_state_unittest.cc",
     "proto_trace_parser_unittest.cc",
     "string_encoding_utils_unittests.cc",
   ]
@@ -273,7 +273,6 @@
     "../../storage",
     "../../types",
     "../../util:descriptors",
-    "../../util:stack_traces_util",
     "../common",
     "../ftrace:full",
   ]
diff --git a/src/trace_processor/importers/proto/heap_graph_module.cc b/src/trace_processor/importers/proto/heap_graph_module.cc
index 93fd468..cc1d7ad 100644
--- a/src/trace_processor/importers/proto/heap_graph_module.cc
+++ b/src/trace_processor/importers/proto/heap_graph_module.cc
@@ -19,9 +19,9 @@
 #include "src/trace_processor/importers/common/parser_types.h"
 #include "src/trace_processor/importers/common/process_tracker.h"
 #include "src/trace_processor/importers/proto/heap_graph_tracker.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
 #include "src/trace_processor/storage/trace_storage.h"
 #include "src/trace_processor/types/trace_processor_context.h"
-#include "src/trace_processor/util/profiler_util.h"
 
 #include "protos/perfetto/trace/profiling/deobfuscation.pbzero.h"
 #include "protos/perfetto/trace/profiling/heap_graph.pbzero.h"
diff --git a/src/trace_processor/importers/proto/heap_graph_tracker.cc b/src/trace_processor/importers/proto/heap_graph_tracker.cc
index 2e95889..fcbd054 100644
--- a/src/trace_processor/importers/proto/heap_graph_tracker.cc
+++ b/src/trace_processor/importers/proto/heap_graph_tracker.cc
@@ -22,8 +22,8 @@
 #include "perfetto/ext/base/string_splitter.h"
 #include "perfetto/ext/base/string_utils.h"
 #include "protos/perfetto/trace/profiling/heap_graph.pbzero.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
 #include "src/trace_processor/tables/profiler_tables_py.h"
-#include "src/trace_processor/util/profiler_util.h"
 
 namespace perfetto {
 namespace trace_processor {
diff --git a/src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc b/src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc
index ebc2a5e..70c7398 100644
--- a/src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc
+++ b/src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc
@@ -18,7 +18,7 @@
 
 #include "perfetto/base/logging.h"
 #include "src/trace_processor/importers/common/process_tracker.h"
-#include "src/trace_processor/util/profiler_util.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
 #include "test/gtest_and_gmock.h"
 
 namespace perfetto {
diff --git a/src/trace_processor/importers/proto/heap_profile_tracker.cc b/src/trace_processor/importers/proto/heap_profile_tracker.cc
new file mode 100644
index 0000000..ea20108
--- /dev/null
+++ b/src/trace_processor/importers/proto/heap_profile_tracker.cc
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
+
+#include "perfetto/base/logging.h"
+#include "src/trace_processor/importers/common/process_tracker.h"
+#include "src/trace_processor/types/trace_processor_context.h"
+
+#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
+#include "protos/perfetto/trace/profiling/profile_packet.pbzero.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+HeapProfileTracker::HeapProfileTracker(TraceProcessorContext* context)
+    : context_(context),
+      empty_(context_->storage->InternString({"", 0})),
+      art_heap_(context_->storage->InternString("com.android.art")) {}
+
+HeapProfileTracker::~HeapProfileTracker() = default;
+
+void HeapProfileTracker::SetProfilePacketIndex(uint32_t seq_id,
+                                               uint64_t index) {
+  SequenceState& sequence_state = sequence_state_[seq_id];
+  bool dropped_packet = false;
+  // heapprofd starts counting at index = 0.
+  if (!sequence_state.prev_index && index != 0) {
+    dropped_packet = true;
+  }
+
+  if (sequence_state.prev_index && *sequence_state.prev_index + 1 != index) {
+    dropped_packet = true;
+  }
+
+  if (dropped_packet) {
+    if (sequence_state.prev_index) {
+      PERFETTO_ELOG("Missing packets between %" PRIu64 " and %" PRIu64,
+                    *sequence_state.prev_index, index);
+    } else {
+      PERFETTO_ELOG("Invalid first packet index %" PRIu64 " (!= 0)", index);
+    }
+
+    context_->storage->IncrementStats(stats::heapprofd_missing_packet);
+  }
+  sequence_state.prev_index = index;
+}
+
+void HeapProfileTracker::AddAllocation(
+    uint32_t seq_id,
+    SequenceStackProfileTracker* sequence_stack_profile_tracker,
+    const SourceAllocation& alloc,
+    const SequenceStackProfileTracker::InternLookup* intern_lookup) {
+  SequenceState& sequence_state = sequence_state_[seq_id];
+
+  auto opt_callstack_id = sequence_stack_profile_tracker->FindOrInsertCallstack(
+      alloc.callstack_id, intern_lookup);
+  if (!opt_callstack_id)
+    return;
+
+  CallsiteId callstack_id = *opt_callstack_id;
+
+  UniquePid upid = context_->process_tracker->GetOrCreateProcess(
+      static_cast<uint32_t>(alloc.pid));
+
+  tables::HeapProfileAllocationTable::Row alloc_row{
+      alloc.timestamp,
+      upid,
+      alloc.heap_name,
+      callstack_id,
+      static_cast<int64_t>(alloc.alloc_count),
+      static_cast<int64_t>(alloc.self_allocated)};
+
+  tables::HeapProfileAllocationTable::Row free_row{
+      alloc.timestamp,
+      upid,
+      alloc.heap_name,
+      callstack_id,
+      -static_cast<int64_t>(alloc.free_count),
+      -static_cast<int64_t>(alloc.self_freed)};
+
+  auto prev_alloc_it = sequence_state.prev_alloc.find({upid, callstack_id});
+  if (prev_alloc_it == sequence_state.prev_alloc.end()) {
+    std::tie(prev_alloc_it, std::ignore) = sequence_state.prev_alloc.emplace(
+        std::make_pair(upid, callstack_id),
+        tables::HeapProfileAllocationTable::Row{});
+  }
+
+  tables::HeapProfileAllocationTable::Row& prev_alloc = prev_alloc_it->second;
+
+  auto prev_free_it = sequence_state.prev_free.find({upid, callstack_id});
+  if (prev_free_it == sequence_state.prev_free.end()) {
+    std::tie(prev_free_it, std::ignore) = sequence_state.prev_free.emplace(
+        std::make_pair(upid, callstack_id),
+        tables::HeapProfileAllocationTable::Row{});
+  }
+
+  tables::HeapProfileAllocationTable::Row& prev_free = prev_free_it->second;
+
+  std::set<CallsiteId>& callstacks_for_source_callstack_id =
+      sequence_state.seen_callstacks[SourceAllocationIndex{
+          upid, alloc.callstack_id, alloc.heap_name}];
+  bool new_callstack;
+  std::tie(std::ignore, new_callstack) =
+      callstacks_for_source_callstack_id.emplace(callstack_id);
+
+  if (new_callstack) {
+    sequence_state.alloc_correction[alloc.callstack_id] = prev_alloc;
+    sequence_state.free_correction[alloc.callstack_id] = prev_free;
+  }
+
+  auto alloc_correction_it =
+      sequence_state.alloc_correction.find(alloc.callstack_id);
+  if (alloc_correction_it != sequence_state.alloc_correction.end()) {
+    const auto& alloc_correction = alloc_correction_it->second;
+    alloc_row.count += alloc_correction.count;
+    alloc_row.size += alloc_correction.size;
+  }
+
+  auto free_correction_it =
+      sequence_state.free_correction.find(alloc.callstack_id);
+  if (free_correction_it != sequence_state.free_correction.end()) {
+    const auto& free_correction = free_correction_it->second;
+    free_row.count += free_correction.count;
+    free_row.size += free_correction.size;
+  }
+
+  tables::HeapProfileAllocationTable::Row alloc_delta = alloc_row;
+  tables::HeapProfileAllocationTable::Row free_delta = free_row;
+
+  alloc_delta.count -= prev_alloc.count;
+  alloc_delta.size -= prev_alloc.size;
+
+  free_delta.count -= prev_free.count;
+  free_delta.size -= prev_free.size;
+
+  if (alloc_delta.count < 0 || alloc_delta.size < 0 || free_delta.count > 0 ||
+      free_delta.size > 0) {
+    PERFETTO_DLOG("Non-monotonous allocation.");
+    context_->storage->IncrementIndexedStats(stats::heapprofd_malformed_packet,
+                                             static_cast<int>(upid));
+    return;
+  }
+
+  // Dump at max profiles do not have .count set.
+  if (alloc_delta.count || alloc_delta.size) {
+    context_->storage->mutable_heap_profile_allocation_table()->Insert(
+        alloc_delta);
+  }
+
+  // ART only reports allocations, and not frees. This throws off our logic
+  // that assumes that if a new object was allocated with the same address,
+  // the old one has to have been freed in the meantime.
+  // See HeapTracker::RecordMalloc in bookkeeping.cc.
+  if (alloc.heap_name != art_heap_ && (free_delta.count || free_delta.size)) {
+    context_->storage->mutable_heap_profile_allocation_table()->Insert(
+        free_delta);
+  }
+
+  prev_alloc = alloc_row;
+  prev_free = free_row;
+}
+
+void HeapProfileTracker::StoreAllocation(uint32_t seq_id,
+                                         SourceAllocation alloc) {
+  SequenceState& sequence_state = sequence_state_[seq_id];
+  sequence_state.pending_allocs.emplace_back(std::move(alloc));
+}
+
+void HeapProfileTracker::CommitAllocations(
+    uint32_t seq_id,
+    SequenceStackProfileTracker* sequence_stack_profile_tracker,
+    const SequenceStackProfileTracker::InternLookup* intern_lookup) {
+  SequenceState& sequence_state = sequence_state_[seq_id];
+  for (const auto& p : sequence_state.pending_allocs)
+    AddAllocation(seq_id, sequence_stack_profile_tracker, p, intern_lookup);
+  sequence_state.pending_allocs.clear();
+}
+
+void HeapProfileTracker::FinalizeProfile(
+    uint32_t seq_id,
+    SequenceStackProfileTracker* sequence_stack_profile_tracker,
+    const SequenceStackProfileTracker::InternLookup* intern_lookup) {
+  CommitAllocations(seq_id, sequence_stack_profile_tracker, intern_lookup);
+  sequence_stack_profile_tracker->ClearIndices();
+}
+
+void HeapProfileTracker::NotifyEndOfFile() {
+  for (const auto& key_and_sequence_state : sequence_state_) {
+    const SequenceState& sequence_state = key_and_sequence_state.second;
+    if (!sequence_state.pending_allocs.empty()) {
+      context_->storage->IncrementStats(stats::heapprofd_non_finalized_profile);
+    }
+  }
+}
+
+}  // namespace trace_processor
+}  // namespace perfetto
diff --git a/src/trace_processor/importers/proto/heap_profile_tracker.h b/src/trace_processor/importers/proto/heap_profile_tracker.h
new file mode 100644
index 0000000..5ed5394
--- /dev/null
+++ b/src/trace_processor/importers/proto/heap_profile_tracker.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_HEAP_PROFILE_TRACKER_H_
+#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_HEAP_PROFILE_TRACKER_H_
+
+#include <optional>
+#include <set>
+#include <unordered_map>
+
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
+#include "src/trace_processor/storage/trace_storage.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+class TraceProcessorContext;
+
+class HeapProfileTracker {
+ public:
+  struct SourceAllocation {
+    uint64_t pid = 0;
+    // This is int64_t, because we get this from the TraceSorter which also
+    // converts this for us.
+    int64_t timestamp = 0;
+    StringPool::Id heap_name;
+    SequenceStackProfileTracker::SourceCallstackId callstack_id = 0;
+    uint64_t self_allocated = 0;
+    uint64_t self_freed = 0;
+    uint64_t alloc_count = 0;
+    uint64_t free_count = 0;
+  };
+
+  void SetProfilePacketIndex(uint32_t seq_id, uint64_t id);
+
+  explicit HeapProfileTracker(TraceProcessorContext* context);
+
+  void StoreAllocation(uint32_t seq_id, SourceAllocation);
+
+  // Call after the last profile packet of a dump to commit the allocations
+  // that had been stored using StoreAllocation and clear internal indices
+  // for that dump.
+  void FinalizeProfile(
+      uint32_t seq_id,
+      SequenceStackProfileTracker* sequence_stack_profile_tracker,
+      const SequenceStackProfileTracker::InternLookup* lookup);
+
+  // Only commit the allocations that had been stored using StoreAllocations.
+  // This is only needed in tests, use FinalizeProfile instead.
+  void CommitAllocations(
+      uint32_t seq_id,
+      SequenceStackProfileTracker* sequence_stack_profile_tracker,
+      const SequenceStackProfileTracker::InternLookup* lookup);
+
+  void NotifyEndOfFile();
+
+  ~HeapProfileTracker();
+
+ private:
+  void AddAllocation(
+      uint32_t seq_id,
+      SequenceStackProfileTracker* sequence_stack_profile_tracker,
+      const SourceAllocation&,
+      const SequenceStackProfileTracker::InternLookup* intern_lookup = nullptr);
+  struct SourceAllocationIndex {
+    UniquePid upid;
+    SequenceStackProfileTracker::SourceCallstackId src_callstack_id;
+    StringPool::Id heap_name;
+    bool operator<(const SourceAllocationIndex& o) const {
+      return std::tie(upid, src_callstack_id, heap_name) <
+             std::tie(o.upid, o.src_callstack_id, o.heap_name);
+    }
+  };
+  struct SequenceState {
+    std::vector<SourceAllocation> pending_allocs;
+
+    std::unordered_map<std::pair<UniquePid, CallsiteId>,
+                       tables::HeapProfileAllocationTable::Row>
+        prev_alloc;
+    std::unordered_map<std::pair<UniquePid, CallsiteId>,
+                       tables::HeapProfileAllocationTable::Row>
+        prev_free;
+
+    // For continuous dumps, we only store the delta in the data-base. To do
+    // this, we subtract the previous dump's value. Sometimes, we should not
+    // do that subtraction, because heapprofd garbage collects stacks that
+    // have no unfreed allocations. If the application then allocations again
+    // at that stack, it gets recreated and initialized to zero.
+    //
+    // To correct for this, we add the previous' stacks value to the current
+    // one, and then handle it as normal. If it is the first time we see a
+    // SourceCallstackId for a CallsiteId, we put the previous value into
+    // the correction maps below.
+    std::map<SourceAllocationIndex, std::set<CallsiteId>> seen_callstacks;
+    std::map<SequenceStackProfileTracker::SourceCallstackId,
+             tables::HeapProfileAllocationTable::Row>
+        alloc_correction;
+    std::map<SequenceStackProfileTracker::SourceCallstackId,
+             tables::HeapProfileAllocationTable::Row>
+        free_correction;
+
+    std::optional<uint64_t> prev_index;
+  };
+  std::map<uint32_t, SequenceState> sequence_state_;
+  TraceProcessorContext* const context_;
+  const StringId empty_;
+  const StringId art_heap_;
+};
+
+}  // namespace trace_processor
+}  // namespace perfetto
+
+#endif  // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_HEAP_PROFILE_TRACKER_H_
diff --git a/src/trace_processor/importers/proto/profile_packet_sequence_state_unittest.cc b/src/trace_processor/importers/proto/heap_profile_tracker_unittest.cc
similarity index 74%
rename from src/trace_processor/importers/proto/profile_packet_sequence_state_unittest.cc
rename to src/trace_processor/importers/proto/heap_profile_tracker_unittest.cc
index ab947fa..558ad91 100644
--- a/src/trace_processor/importers/proto/profile_packet_sequence_state_unittest.cc
+++ b/src/trace_processor/importers/proto/heap_profile_tracker_unittest.cc
@@ -14,12 +14,9 @@
  * limitations under the License.
  */
 
-#include "src/trace_processor/importers/proto/profile_packet_sequence_state.h"
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
 
-#include <memory>
-
-#include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
 #include "src/trace_processor/types/trace_processor_context.h"
 #include "test/gtest_and_gmock.h"
 
@@ -43,6 +40,7 @@
 constexpr auto kMappingStart = 234;
 constexpr auto kMappingEnd = 345;
 constexpr auto kMappingLoadBias = 456;
+constexpr auto kDefaultSequence = 1;
 
 // heapprofd on Android Q has large callstack ideas, explicitly test large
 // values.
@@ -58,8 +56,10 @@
  public:
   HeapProfileTrackerDupTest() {
     context.storage.reset(new TraceStorage());
-    context.stack_profile_tracker.reset(new StackProfileTracker(&context));
-    packet_sequence_state.reset(new PacketSequenceState(&context));
+    context.global_stack_profile_tracker.reset(new GlobalStackProfileTracker());
+    sequence_stack_profile_tracker.reset(
+        new SequenceStackProfileTracker(&context));
+    context.heap_profile_tracker.reset(new HeapProfileTracker(&context));
 
     mapping_name = context.storage->InternString("[mapping]");
     fully_qualified_mapping_name = context.storage->InternString("/[mapping]");
@@ -68,17 +68,13 @@
   }
 
  protected:
-  ProfilePacketSequenceState& profile_packet_sequence_state() {
-    return *packet_sequence_state->current_generation()
-                ->GetOrCreate<ProfilePacketSequenceState>();
-  }
   void InsertMapping(const Packet& packet) {
-    profile_packet_sequence_state().AddString(packet.mapping_name_id,
+    sequence_stack_profile_tracker->AddString(packet.mapping_name_id,
                                               "[mapping]");
 
-    profile_packet_sequence_state().AddString(packet.build_id, kBuildIDName);
+    sequence_stack_profile_tracker->AddString(packet.build_id, kBuildIDName);
 
-    ProfilePacketSequenceState::SourceMapping first_frame;
+    SequenceStackProfileTracker::SourceMapping first_frame;
     first_frame.build_id = packet.build_id;
     first_frame.exact_offset = kMappingExactOffset;
     first_frame.start_offset = kMappingStartOffset;
@@ -87,27 +83,27 @@
     first_frame.load_bias = kMappingLoadBias;
     first_frame.name_ids = {packet.mapping_name_id};
 
-    profile_packet_sequence_state().AddMapping(packet.mapping_id, first_frame);
+    sequence_stack_profile_tracker->AddMapping(packet.mapping_id, first_frame);
   }
 
   void InsertFrame(const Packet& packet) {
     InsertMapping(packet);
-    profile_packet_sequence_state().AddString(packet.frame_name_id, "[frame]");
+    sequence_stack_profile_tracker->AddString(packet.frame_name_id, "[frame]");
 
-    ProfilePacketSequenceState::SourceFrame first_frame;
+    SequenceStackProfileTracker::SourceFrame first_frame;
     first_frame.name_id = packet.frame_name_id;
     first_frame.mapping_id = packet.mapping_id;
     first_frame.rel_pc = kFrameRelPc;
 
-    profile_packet_sequence_state().AddFrame(packet.frame_id, first_frame);
+    sequence_stack_profile_tracker->AddFrame(packet.frame_id, first_frame);
   }
 
   void InsertCallsite(const Packet& packet) {
     InsertFrame(packet);
 
-    ProfilePacketSequenceState::SourceCallstack first_callsite = {
+    SequenceStackProfileTracker::SourceCallstack first_callsite = {
         packet.frame_id, packet.frame_id};
-    profile_packet_sequence_state().AddCallstack(kCallstackId, first_callsite);
+    sequence_stack_profile_tracker->AddCallstack(kCallstackId, first_callsite);
   }
 
   StringId mapping_name;
@@ -115,16 +111,18 @@
   StringId build;
   StringId frame_name;
   TraceProcessorContext context;
-  std::unique_ptr<PacketSequenceState> packet_sequence_state;
+  std::unique_ptr<SequenceStackProfileTracker> sequence_stack_profile_tracker;
 };
 
 // Insert the same mapping from two different packets, with different strings
 // interned, and assert we only store one.
 TEST_F(HeapProfileTrackerDupTest, Mapping) {
   InsertMapping(kFirstPacket);
-  profile_packet_sequence_state().FinalizeProfile();
+  context.heap_profile_tracker->FinalizeProfile(
+      kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
   InsertMapping(kSecondPacket);
-  profile_packet_sequence_state().FinalizeProfile();
+  context.heap_profile_tracker->FinalizeProfile(
+      kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
 
   EXPECT_THAT(context.storage->stack_profile_mapping_table().build_id()[0],
               context.storage->InternString({kBuildIDHexName}));
@@ -146,9 +144,11 @@
 // interned, and assert we only store one.
 TEST_F(HeapProfileTrackerDupTest, Frame) {
   InsertFrame(kFirstPacket);
-  profile_packet_sequence_state().FinalizeProfile();
+  context.heap_profile_tracker->FinalizeProfile(
+      kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
   InsertFrame(kSecondPacket);
-  profile_packet_sequence_state().FinalizeProfile();
+  context.heap_profile_tracker->FinalizeProfile(
+      kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
 
   const auto& frames = context.storage->stack_profile_frame_table();
   EXPECT_THAT(frames.name()[0], frame_name);
@@ -160,9 +160,11 @@
 // stored once.
 TEST_F(HeapProfileTrackerDupTest, Callstack) {
   InsertCallsite(kFirstPacket);
-  profile_packet_sequence_state().FinalizeProfile();
+  context.heap_profile_tracker->FinalizeProfile(
+      kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
   InsertCallsite(kSecondPacket);
-  profile_packet_sequence_state().FinalizeProfile();
+  context.heap_profile_tracker->FinalizeProfile(
+      kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
 
   const auto& callsite_table = context.storage->stack_profile_callsite_table();
   const auto& depth = callsite_table.depth();
@@ -196,20 +198,22 @@
 TEST(HeapProfileTrackerTest, SourceMappingPath) {
   TraceProcessorContext context;
   context.storage.reset(new TraceStorage());
-  context.stack_profile_tracker.reset(new StackProfileTracker(&context));
-  PacketSequenceState pss(&context);
-  ProfilePacketSequenceState& ppss =
-      *pss.current_generation()->GetOrCreate<ProfilePacketSequenceState>();
+  context.global_stack_profile_tracker.reset(new GlobalStackProfileTracker());
+  context.heap_profile_tracker.reset(new HeapProfileTracker(&context));
+
+  HeapProfileTracker* hpt = context.heap_profile_tracker.get();
+  std::unique_ptr<SequenceStackProfileTracker> spt(
+      new SequenceStackProfileTracker(&context));
 
   constexpr auto kBuildId = 1u;
   constexpr auto kMappingNameId1 = 2u;
   constexpr auto kMappingNameId2 = 3u;
 
-  ppss.AddString(kBuildId, "buildid");
-  ppss.AddString(kMappingNameId1, "foo");
-  ppss.AddString(kMappingNameId2, "bar");
+  spt->AddString(kBuildId, "buildid");
+  spt->AddString(kMappingNameId1, "foo");
+  spt->AddString(kMappingNameId2, "bar");
 
-  ProfilePacketSequenceState::SourceMapping mapping;
+  SequenceStackProfileTracker::SourceMapping mapping;
   mapping.build_id = kBuildId;
   mapping.exact_offset = 1;
   mapping.start_offset = 1;
@@ -217,8 +221,8 @@
   mapping.end = 3;
   mapping.load_bias = 0;
   mapping.name_ids = {kMappingNameId1, kMappingNameId2};
-  ppss.AddMapping(0, mapping);
-  ppss.CommitAllocations();
+  spt->AddMapping(0, mapping);
+  hpt->CommitAllocations(kDefaultSequence, spt.get(), nullptr);
   auto foo_bar_id = context.storage->string_pool().GetId("/foo/bar");
   ASSERT_NE(foo_bar_id, std::nullopt);
   EXPECT_THAT(context.storage->stack_profile_mapping_table().name()[0],
@@ -229,11 +233,12 @@
 TEST(HeapProfileTrackerTest, Functional) {
   TraceProcessorContext context;
   context.storage.reset(new TraceStorage());
-  context.stack_profile_tracker.reset(new StackProfileTracker(&context));
+  context.global_stack_profile_tracker.reset(new GlobalStackProfileTracker());
+  context.heap_profile_tracker.reset(new HeapProfileTracker(&context));
 
-  PacketSequenceState pss(&context);
-  ProfilePacketSequenceState& ppss =
-      *pss.current_generation()->GetOrCreate<ProfilePacketSequenceState>();
+  HeapProfileTracker* hpt = context.heap_profile_tracker.get();
+  std::unique_ptr<SequenceStackProfileTracker> spt(
+      new SequenceStackProfileTracker(&context));
 
   uint32_t next_string_intern_id = 1;
 
@@ -247,7 +252,7 @@
   for (size_t i = 0; i < base::ArraySize(mapping_names); ++i)
     mapping_name_ids[i] = next_string_intern_id++;
 
-  ProfilePacketSequenceState::SourceMapping
+  SequenceStackProfileTracker::SourceMapping
       mappings[base::ArraySize(mapping_names)] = {};
   mappings[0].build_id = build_id_ids[0];
   mappings[0].exact_offset = 1;
@@ -278,7 +283,7 @@
   for (size_t i = 0; i < base::ArraySize(function_names); ++i)
     function_name_ids[i] = next_string_intern_id++;
 
-  ProfilePacketSequenceState::SourceFrame
+  SequenceStackProfileTracker::SourceFrame
       frames[base::ArraySize(function_names)];
   frames[0].name_id = function_name_ids[0];
   frames[0].mapping_id = 0;
@@ -296,41 +301,41 @@
   frames[3].mapping_id = 2;
   frames[3].rel_pc = 123;
 
-  ProfilePacketSequenceState::SourceCallstack callstacks[3];
+  SequenceStackProfileTracker::SourceCallstack callstacks[3];
   callstacks[0] = {2, 1, 0};
   callstacks[1] = {2, 1, 0, 1, 0};
   callstacks[2] = {0, 2, 0, 1, 2};
 
   for (size_t i = 0; i < base::ArraySize(build_ids); ++i) {
     auto interned = base::StringView(build_ids[i].data(), build_ids[i].size());
-    ppss.AddString(build_id_ids[i], interned);
+    spt->AddString(build_id_ids[i], interned);
   }
   for (size_t i = 0; i < base::ArraySize(mapping_names); ++i) {
     auto interned =
         base::StringView(mapping_names[i].data(), mapping_names[i].size());
-    ppss.AddString(mapping_name_ids[i], interned);
+    spt->AddString(mapping_name_ids[i], interned);
   }
   for (size_t i = 0; i < base::ArraySize(function_names); ++i) {
     auto interned =
         base::StringView(function_names[i].data(), function_names[i].size());
-    ppss.AddString(function_name_ids[i], interned);
+    spt->AddString(function_name_ids[i], interned);
   }
 
   for (uint32_t i = 0; i < base::ArraySize(mappings); ++i)
-    ppss.AddMapping(i, mappings[i]);
+    spt->AddMapping(i, mappings[i]);
   for (uint32_t i = 0; i < base::ArraySize(frames); ++i)
-    ppss.AddFrame(i, frames[i]);
+    spt->AddFrame(i, frames[i]);
   for (uint32_t i = 0; i < base::ArraySize(callstacks); ++i)
-    ppss.AddCallstack(i, callstacks[i]);
+    spt->AddCallstack(i, callstacks[i]);
 
-  ppss.CommitAllocations();
+  hpt->CommitAllocations(kDefaultSequence, spt.get(), nullptr);
 
   for (size_t i = 0; i < base::ArraySize(callstacks); ++i) {
     std::optional<CallsiteId> parent;
-    const ProfilePacketSequenceState::SourceCallstack& callstack =
+    const SequenceStackProfileTracker::SourceCallstack& callstack =
         callstacks[i];
     for (size_t depth = 0; depth < callstack.size(); ++depth) {
-      auto frame_id = ppss.GetDatabaseFrameIdForTesting(callstack[depth]);
+      auto frame_id = spt->GetDatabaseFrameIdForTesting(callstack[depth]);
       std::optional<CallsiteId> self = FindCallstack(
           *context.storage, static_cast<int64_t>(depth), parent, frame_id);
       ASSERT_TRUE(self.has_value());
@@ -338,7 +343,7 @@
     }
   }
 
-  ppss.FinalizeProfile();
+  hpt->FinalizeProfile(kDefaultSequence, spt.get(), nullptr);
 }
 
 }  // namespace
diff --git a/src/trace_processor/importers/proto/packet_sequence_state.h b/src/trace_processor/importers/proto/packet_sequence_state.h
index 2ad0c7b..8c29222 100644
--- a/src/trace_processor/importers/proto/packet_sequence_state.h
+++ b/src/trace_processor/importers/proto/packet_sequence_state.h
@@ -19,12 +19,13 @@
 
 #include <stdint.h>
 
-#include <memory>
-#include <type_traits>
+#include <unordered_map>
 #include <vector>
 
 #include "perfetto/base/compiler.h"
 #include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
+#include "src/trace_processor/storage/trace_storage.h"
 #include "src/trace_processor/types/trace_processor_context.h"
 #include "src/trace_processor/util/interned_message_view.h"
 
@@ -33,8 +34,19 @@
 
 class PacketSequenceState {
  public:
+  // Helper to keep per sequence state. These are not reset when the generation
+  // changes.
+  // Trackers or parsers can add their custom per sequence state here instead of
+  // keeping a map from seq_id to some internal state.
+  // TODO(carlscab): We should come up with a nicer API that allows extensions
+  // to be notified of generation changes.
+  // TODO(carlscab): There is some existing code that could use this. Migrate.
+  struct ExtensibleSequenceState {
+    std::unique_ptr<Destructible> v8_sequence_state;
+  };
+
   explicit PacketSequenceState(TraceProcessorContext* context)
-      : context_(context) {
+      : context_(context), sequence_stack_profile_tracker_(context) {
     current_generation_.reset(
         new PacketSequenceStateGeneration(this, generation_index_++));
   }
@@ -75,7 +87,7 @@
     // sequence. Add a new generation with the updated defaults but the
     // current generation's interned data state.
     current_generation_.reset(new PacketSequenceStateGeneration(
-        this, generation_index_++, current_generation_.get(),
+        this, generation_index_++, current_generation_->interned_data_,
         std::move(defaults)));
   }
 
@@ -107,6 +119,14 @@
 
   bool IsIncrementalStateValid() const { return !packet_loss_; }
 
+  SequenceStackProfileTracker& sequence_stack_profile_tracker() {
+    return sequence_stack_profile_tracker_;
+  }
+
+  ExtensibleSequenceState& extensible_sequence_state() {
+    return extensible_sequence_state_;
+  }
+
   // Returns a ref-counted ptr to the current generation.
   RefPtr<PacketSequenceStateGeneration> current_generation() const {
     return current_generation_;
@@ -154,8 +174,20 @@
   int64_t track_event_thread_instruction_count_ = 0;
 
   RefPtr<PacketSequenceStateGeneration> current_generation_;
+  SequenceStackProfileTracker sequence_stack_profile_tracker_;
+  ExtensibleSequenceState extensible_sequence_state_;
 };
 
+template <uint32_t FieldId, typename MessageType>
+typename MessageType::Decoder*
+PacketSequenceStateGeneration::LookupInternedMessage(uint64_t iid) {
+  auto* interned_message_view = GetInternedMessageView(FieldId, iid);
+  if (!interned_message_view)
+    return nullptr;
+
+  return interned_message_view->template GetOrCreateDecoder<MessageType>();
+}
+
 }  // namespace trace_processor
 }  // namespace perfetto
 
diff --git a/src/trace_processor/importers/proto/packet_sequence_state_generation.cc b/src/trace_processor/importers/proto/packet_sequence_state_generation.cc
index 1e89096..6e8e98d 100644
--- a/src/trace_processor/importers/proto/packet_sequence_state_generation.cc
+++ b/src/trace_processor/importers/proto/packet_sequence_state_generation.cc
@@ -15,38 +15,12 @@
  */
 
 #include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
-#include <cstddef>
 
 #include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/storage/trace_storage.h"
 
 namespace perfetto {
 namespace trace_processor {
 
-PacketSequenceStateGeneration::PacketSequenceStateGeneration(
-    PacketSequenceState* state,
-    size_t generation_index,
-    PacketSequenceStateGeneration* prev_gen,
-    TraceBlobView defaults)
-    : state_(state),
-      generation_index_(generation_index),
-      interned_data_(prev_gen->interned_data_),
-      trace_packet_defaults_(InternedMessageView(std::move(defaults))),
-      trackers_(prev_gen->trackers_) {
-  for (auto& t : trackers_) {
-    if (t.get() != nullptr) {
-      t->set_generation(this);
-    }
-  }
-}
-
-PacketSequenceStateGeneration::InternedDataTracker::~InternedDataTracker() =
-    default;
-
-TraceProcessorContext* PacketSequenceStateGeneration::GetContext() const {
-  return state_->context();
-}
-
 void PacketSequenceStateGeneration::InternMessage(uint32_t field_id,
                                                   TraceBlobView message) {
   constexpr auto kIidFieldNumber = 1;
diff --git a/src/trace_processor/importers/proto/packet_sequence_state_generation.h b/src/trace_processor/importers/proto/packet_sequence_state_generation.h
index 1f05d5c..9c7aa5a 100644
--- a/src/trace_processor/importers/proto/packet_sequence_state_generation.h
+++ b/src/trace_processor/importers/proto/packet_sequence_state_generation.h
@@ -17,17 +17,10 @@
 #ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PACKET_SEQUENCE_STATE_GENERATION_H_
 #define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PACKET_SEQUENCE_STATE_GENERATION_H_
 
-#include <array>
-#include <cstddef>
-#include <memory>
 #include <optional>
-#include <tuple>
-#include <type_traits>
 #include <unordered_map>
 
-#include "perfetto/public/compiler.h"
 #include "perfetto/trace_processor/ref_counted.h"
-#include "perfetto/trace_processor/trace_blob_view.h"
 #include "src/trace_processor/util/interned_message_view.h"
 
 #include "protos/perfetto/trace/trace_packet_defaults.pbzero.h"
@@ -42,65 +35,9 @@
     std::unordered_map<uint32_t /*field_id*/, InternedMessageMap>;
 
 class PacketSequenceState;
-class TraceProcessorContext;
-
-class StackProfileSequenceState;
-class ProfilePacketSequenceState;
-class V8SequenceState;
-
-using InternedDataTrackers = std::tuple<StackProfileSequenceState,
-                                        ProfilePacketSequenceState,
-                                        V8SequenceState>;
 
 class PacketSequenceStateGeneration : public RefCounted {
  public:
-  // Base class to add custom sequence state. This state is keep per sequence
-  // and per incremental state interval, that is, each time incremental state is
-  // reset a new instance is created but not each time `TracePacketDefaults` are
-  // updated. Note that this means that different
-  // `PacketSequenceStateGeneration` instances might point to the same
-  // `InternedDataTracker` (because they only differ in their
-  // `TracePacketDefaults`).
-  //
-  // ATTENTION: You should not create instances of these classes yourself but
-  // use the `PacketSequenceStateGeneration::GetOrCreate<>' method instead.
-  class InternedDataTracker : public RefCounted {
-   public:
-    virtual ~InternedDataTracker();
-
-   protected:
-    template <uint32_t FieldId, typename MessageType>
-    typename MessageType::Decoder* LookupInternedMessage(uint64_t iid) {
-      return generation_->LookupInternedMessage<FieldId, MessageType>(iid);
-    }
-
-    InternedMessageView* GetInternedMessageView(uint32_t field_id,
-                                                uint64_t iid) {
-      return generation_->GetInternedMessageView(field_id, iid);
-    }
-
-    template <typename T>
-    std::remove_cv_t<T>* GetOrCreate() {
-      return generation_->GetOrCreate<T>();
-    }
-
-   private:
-    friend PacketSequenceStateGeneration;
-    // Called when the a new generation is created as a result of
-    // `TracePacketDefaults` being updated.
-    void set_generation(PacketSequenceStateGeneration* generation) {
-      generation_ = generation;
-    }
-
-    // Note: A `InternedDataTracker` instance can be linked to multiple
-    // `PacketSequenceStateGeneration` instances (when there are multiple
-    // `TracePacketDefaults` in the same interning context). `generation_` will
-    // point to the latest one. We keep this member private to prevent misuse /
-    // confusion around this fact. Instead subclasses should access the public
-    // methods of this class to get any interned data.
-    PacketSequenceStateGeneration* generation_ = nullptr;
-  };
-
   // Returns |nullptr| if the message with the given |iid| was not found (also
   // records a stat in this case).
   template <uint32_t FieldId, typename MessageType>
@@ -142,47 +79,21 @@
   PacketSequenceState* state() const { return state_; }
   size_t generation_index() const { return generation_index_; }
 
-  // Extension point for custom sequence state. To add new per sequence state
-  // just subclass ´PacketSequenceStateGeneration´ and get your sequence bound
-  // instance by calling this method.
-  template <typename T>
-  std::remove_cv_t<T>* GetOrCreate();
-
  private:
   friend class PacketSequenceState;
 
-  // Helper to find the index in a tuple of a given type. Lookups are done
-  // ignoring cv qualifiers. If no index is found size of the tuple is returned.
-  //
-  // ATTENTION: Duplicate types in the tuple will trigger a compiler error.
-  template <typename Tuple, typename Type, size_t index = 0>
-  static constexpr size_t FindUniqueType() {
-    constexpr size_t kSize = std::tuple_size_v<Tuple>;
-    if constexpr (index < kSize) {
-      using TypeAtIndex = typename std::tuple_element<index, Tuple>::type;
-      if constexpr (std::is_same_v<std::remove_cv_t<Type>,
-                                   std::remove_cv_t<TypeAtIndex>>) {
-        static_assert(FindUniqueType<Tuple, Type, index + 1>() == kSize,
-                      "Duplicate types.");
-        return index;
-      } else {
-        return FindUniqueType<Tuple, Type, index + 1>();
-      }
-    } else {
-      return kSize;
-    }
-  }
-
   PacketSequenceStateGeneration(PacketSequenceState* state,
                                 size_t generation_index)
       : state_(state), generation_index_(generation_index) {}
 
   PacketSequenceStateGeneration(PacketSequenceState* state,
                                 size_t generation_index,
-                                PacketSequenceStateGeneration* prev_gen,
-                                TraceBlobView defaults);
-
-  TraceProcessorContext* GetContext() const;
+                                InternedFieldMap interned_data,
+                                TraceBlobView defaults)
+      : state_(state),
+        generation_index_(generation_index),
+        interned_data_(interned_data),
+        trace_packet_defaults_(InternedMessageView(std::move(defaults))) {}
 
   void InternMessage(uint32_t field_id, TraceBlobView message);
 
@@ -196,34 +107,8 @@
   size_t generation_index_;
   InternedFieldMap interned_data_;
   std::optional<InternedMessageView> trace_packet_defaults_;
-  std::array<RefPtr<InternedDataTracker>,
-             std::tuple_size_v<InternedDataTrackers>>
-      trackers_;
 };
 
-template <typename T>
-std::remove_cv_t<T>* PacketSequenceStateGeneration::GetOrCreate() {
-  constexpr size_t index = FindUniqueType<InternedDataTrackers, T>();
-  static_assert(index < std::tuple_size_v<InternedDataTrackers>, "Not found");
-  auto& ptr = trackers_[index];
-  if (PERFETTO_UNLIKELY(ptr.get() == nullptr)) {
-    ptr.reset(new T(GetContext()));
-    ptr->set_generation(this);
-  }
-
-  return static_cast<std::remove_cv_t<T>*>(ptr.get());
-}
-
-template <uint32_t FieldId, typename MessageType>
-typename MessageType::Decoder*
-PacketSequenceStateGeneration::LookupInternedMessage(uint64_t iid) {
-  auto* interned_message_view = GetInternedMessageView(FieldId, iid);
-  if (!interned_message_view)
-    return nullptr;
-
-  return interned_message_view->template GetOrCreateDecoder<MessageType>();
-}
-
 }  // namespace trace_processor
 }  // namespace perfetto
 
diff --git a/src/trace_processor/importers/proto/profile_module.cc b/src/trace_processor/importers/proto/profile_module.cc
index 61596d3..c337869 100644
--- a/src/trace_processor/importers/proto/profile_module.cc
+++ b/src/trace_processor/importers/proto/profile_module.cc
@@ -25,18 +25,17 @@
 #include "src/trace_processor/importers/common/deobfuscation_mapping_table.h"
 #include "src/trace_processor/importers/common/event_tracker.h"
 #include "src/trace_processor/importers/common/process_tracker.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
 #include "src/trace_processor/importers/proto/packet_sequence_state.h"
 #include "src/trace_processor/importers/proto/perf_sample_tracker.h"
-#include "src/trace_processor/importers/proto/profile_packet_sequence_state.h"
 #include "src/trace_processor/importers/proto/profile_packet_utils.h"
-#include "src/trace_processor/importers/proto/stack_profile_sequence_state.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
 #include "src/trace_processor/sorter/trace_sorter.h"
 #include "src/trace_processor/storage/stats.h"
 #include "src/trace_processor/storage/trace_storage.h"
 #include "src/trace_processor/tables/profiler_tables_py.h"
 #include "src/trace_processor/types/trace_processor_context.h"
-#include "src/trace_processor/util/profiler_util.h"
 #include "src/trace_processor/util/stack_traces_util.h"
 
 #include "protos/perfetto/common/builtin_clock.pbzero.h"
@@ -92,7 +91,8 @@
       ParsePerfSample(ts, data.sequence_state.get(), decoder);
       return;
     case TracePacket::kProfilePacketFieldNumber:
-      ParseProfilePacket(ts, data.sequence_state->state(),
+      ParseProfilePacket(ts, data.sequence_state.get(),
+                         decoder.trusted_packet_sequence_id(),
                          decoder.profile_packet());
       return;
     case TracePacket::kModuleSymbolsFieldNumber:
@@ -152,8 +152,9 @@
 
   ProcessTracker* procs = context_->process_tracker.get();
   TraceStorage* storage = context_->storage.get();
-  StackProfileSequenceState& stack_profile_sequence_state =
-      *sequence_state->GetOrCreate<StackProfileSequenceState>();
+  SequenceStackProfileTracker& sequence_stack_profile_tracker =
+      sequence_state->state()->sequence_stack_profile_tracker();
+  ProfilePacketInternLookup intern_lookup(sequence_state);
 
   uint32_t pid = static_cast<uint32_t>(sequence_state->state()->pid());
   uint32_t tid = static_cast<uint32_t>(sequence_state->state()->tid());
@@ -170,8 +171,8 @@
       break;
     }
 
-    auto opt_cs_id =
-        stack_profile_sequence_state.FindOrInsertCallstack(*callstack_it);
+    auto opt_cs_id = sequence_stack_profile_tracker.FindOrInsertCallstack(
+        *callstack_it, &intern_lookup);
     if (!opt_cs_id) {
       context_->storage->IncrementStats(stats::stackprofile_parser_error);
       continue;
@@ -246,11 +247,12 @@
       ts, static_cast<double>(sample.timebase_count()),
       sampling_stream.timebase_track_id);
 
-  StackProfileSequenceState& stack_profile_sequence_state =
-      *sequence_state->GetOrCreate<StackProfileSequenceState>();
+  SequenceStackProfileTracker& stack_tracker =
+      sequence_state->state()->sequence_stack_profile_tracker();
+  ProfilePacketInternLookup intern_lookup(sequence_state);
   uint64_t callstack_iid = sample.callstack_iid();
   std::optional<CallsiteId> cs_id =
-      stack_profile_sequence_state.FindOrInsertCallstack(callstack_iid);
+      stack_tracker.FindOrInsertCallstack(callstack_iid, &intern_lookup);
 
   // A failed lookup of the interned callstack can mean either:
   // (a) This is a counter-only profile without callstacks. Due to an
@@ -296,38 +298,45 @@
   context_->storage->mutable_perf_sample_table()->Insert(sample_row);
 }
 
-void ProfileModule::ParseProfilePacket(int64_t ts,
-                                       PacketSequenceState* sequence_state,
-                                       ConstBytes blob) {
-  ProfilePacketSequenceState& profile_packet_sequence_state =
-      *sequence_state->current_generation()
-           ->GetOrCreate<ProfilePacketSequenceState>();
+void ProfileModule::ParseProfilePacket(
+    int64_t ts,
+    PacketSequenceStateGeneration* sequence_state,
+    uint32_t seq_id,
+    ConstBytes blob) {
   protos::pbzero::ProfilePacket::Decoder packet(blob.data, blob.size);
-  profile_packet_sequence_state.SetProfilePacketIndex(packet.index());
+  context_->heap_profile_tracker->SetProfilePacketIndex(seq_id, packet.index());
 
   for (auto it = packet.strings(); it; ++it) {
     protos::pbzero::InternedString::Decoder entry(*it);
+
     const char* str = reinterpret_cast<const char*>(entry.str().data);
     auto str_view = base::StringView(str, entry.str().size);
-    profile_packet_sequence_state.AddString(entry.iid(), str_view);
+    sequence_state->state()->sequence_stack_profile_tracker().AddString(
+        entry.iid(), str_view);
   }
 
   for (auto it = packet.mappings(); it; ++it) {
     protos::pbzero::Mapping::Decoder entry(*it);
-    profile_packet_sequence_state.AddMapping(
-        entry.iid(), ProfilePacketUtils::MakeSourceMapping(entry));
+    SequenceStackProfileTracker::SourceMapping src_mapping =
+        ProfilePacketUtils::MakeSourceMapping(entry);
+    sequence_state->state()->sequence_stack_profile_tracker().AddMapping(
+        entry.iid(), src_mapping);
   }
 
   for (auto it = packet.frames(); it; ++it) {
     protos::pbzero::Frame::Decoder entry(*it);
-    profile_packet_sequence_state.AddFrame(
-        entry.iid(), ProfilePacketUtils::MakeSourceFrame(entry));
+    SequenceStackProfileTracker::SourceFrame src_frame =
+        ProfilePacketUtils::MakeSourceFrame(entry);
+    sequence_state->state()->sequence_stack_profile_tracker().AddFrame(
+        entry.iid(), src_frame);
   }
 
   for (auto it = packet.callstacks(); it; ++it) {
     protos::pbzero::Callstack::Decoder entry(*it);
-    profile_packet_sequence_state.AddCallstack(
-        entry.iid(), ProfilePacketUtils::MakeSourceCallstack(entry));
+    SequenceStackProfileTracker::SourceCallstack src_callstack =
+        ProfilePacketUtils::MakeSourceCallstack(entry);
+    sequence_state->state()->sequence_stack_profile_tracker().AddCallstack(
+        entry.iid(), src_callstack);
   }
 
   for (auto it = packet.process_dumps(); it; ++it) {
@@ -397,7 +406,7 @@
     for (auto sample_it = entry.samples(); sample_it; ++sample_it) {
       protos::pbzero::ProfilePacket::HeapSample::Decoder sample(*sample_it);
 
-      ProfilePacketSequenceState::SourceAllocation src_allocation;
+      HeapProfileTracker::SourceAllocation src_allocation;
       src_allocation.pid = entry.pid();
       if (entry.heap_name().size != 0) {
         src_allocation.heap_name =
@@ -418,11 +427,15 @@
         src_allocation.free_count = sample.free_count();
       }
 
-      profile_packet_sequence_state.StoreAllocation(src_allocation);
+      context_->heap_profile_tracker->StoreAllocation(seq_id, src_allocation);
     }
   }
   if (!packet.continued()) {
-    profile_packet_sequence_state.FinalizeProfile();
+    PERFETTO_CHECK(sequence_state);
+    ProfilePacketInternLookup intern_lookup(sequence_state);
+    context_->heap_profile_tracker->FinalizeProfile(
+        seq_id, &sequence_state->state()->sequence_stack_profile_tracker(),
+        &intern_lookup);
   }
 }
 
@@ -438,7 +451,7 @@
         module_symbols.build_id().data, module_symbols.build_id().size)));
   }
 
-  auto mapping_ids = context_->stack_profile_tracker->FindMappingRow(
+  auto mapping_ids = context_->global_stack_profile_tracker->FindMappingRow(
       context_->storage->InternString(module_symbols.path()), build_id);
   if (mapping_ids.empty()) {
     context_->storage->IncrementStats(stats::stackprofile_invalid_mapping_id);
@@ -471,7 +484,7 @@
       context_->args_translation_table->AddNativeSymbolTranslationRule(
           mapping_id, address_symbols.address(), last_location);
       std::vector<FrameId> frame_ids =
-          context_->stack_profile_tracker->FindFrameIds(
+          context_->global_stack_profile_tracker->FindFrameIds(
               mapping_id, address_symbols.address());
 
       for (const FrameId frame_id : frame_ids) {
@@ -523,16 +536,21 @@
 
       std::vector<tables::StackProfileFrameTable::Id> frames;
       if (opt_package_name_id) {
-        const std::vector<tables::StackProfileFrameTable::Id> pkg_frames =
-            context_->stack_profile_tracker->JavaFramesForName(
+        const std::vector<tables::StackProfileFrameTable::Id>* pkg_frames =
+            context_->global_stack_profile_tracker->JavaFramesForName(
                 {*merged_obfuscated_id, *opt_package_name_id});
-        frames.insert(frames.end(), pkg_frames.begin(), pkg_frames.end());
+        if (pkg_frames) {
+          frames.insert(frames.end(), pkg_frames->begin(), pkg_frames->end());
+        }
       }
       if (opt_memfd_id) {
-        const std::vector<tables::StackProfileFrameTable::Id> memfd_frames =
-            context_->stack_profile_tracker->JavaFramesForName(
+        const std::vector<tables::StackProfileFrameTable::Id>* memfd_frames =
+            context_->global_stack_profile_tracker->JavaFramesForName(
                 {*merged_obfuscated_id, *opt_memfd_id});
-        frames.insert(frames.end(), memfd_frames.begin(), memfd_frames.end());
+        if (memfd_frames) {
+          frames.insert(frames.end(), memfd_frames->begin(),
+                        memfd_frames->end());
+        }
       }
 
       for (tables::StackProfileFrameTable::Id frame_id : frames) {
diff --git a/src/trace_processor/importers/proto/profile_module.h b/src/trace_processor/importers/proto/profile_module.h
index 883fb7a..e6674d7 100644
--- a/src/trace_processor/importers/proto/profile_module.h
+++ b/src/trace_processor/importers/proto/profile_module.h
@@ -65,7 +65,8 @@
 
   // heap profiling:
   void ParseProfilePacket(int64_t ts,
-                          PacketSequenceState*,
+                          PacketSequenceStateGeneration*,
+                          uint32_t seq_id,
                           protozero::ConstBytes);
   void ParseDeobfuscationMapping(int64_t ts,
                                  PacketSequenceStateGeneration*,
diff --git a/src/trace_processor/importers/proto/profile_packet_sequence_state.cc b/src/trace_processor/importers/proto/profile_packet_sequence_state.cc
deleted file mode 100644
index 71a4b13..0000000
--- a/src/trace_processor/importers/proto/profile_packet_sequence_state.cc
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright (C) 2019 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.
- */
-
-#include "src/trace_processor/importers/proto/profile_packet_sequence_state.h"
-
-#include "perfetto/base/flat_set.h"
-#include "perfetto/ext/base/string_view.h"
-#include "src/trace_processor/importers/common/process_tracker.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
-#include "src/trace_processor/importers/proto/profile_packet_utils.h"
-#include "src/trace_processor/importers/proto/stack_profile_sequence_state.h"
-#include "src/trace_processor/storage/stats.h"
-#include "src/trace_processor/storage/trace_storage.h"
-#include "src/trace_processor/types/trace_processor_context.h"
-
-namespace perfetto {
-namespace trace_processor {
-namespace {
-const char kArtHeapName[] = "com.android.art";
-}
-
-ProfilePacketSequenceState::ProfilePacketSequenceState(
-    TraceProcessorContext* context)
-    : context_(context) {}
-
-ProfilePacketSequenceState::~ProfilePacketSequenceState() = default;
-
-void ProfilePacketSequenceState::SetProfilePacketIndex(uint64_t index) {
-  bool dropped_packet = false;
-  // heapprofd starts counting at index = 0.
-  if (!prev_index.has_value() && index != 0) {
-    dropped_packet = true;
-  }
-
-  if (prev_index.has_value() && *prev_index + 1 != index) {
-    dropped_packet = true;
-  }
-
-  if (dropped_packet) {
-    context_->storage->IncrementStats(stats::heapprofd_missing_packet);
-  }
-  prev_index = index;
-}
-
-void ProfilePacketSequenceState::AddString(SourceStringId id,
-                                           base::StringView str) {
-  strings_.Insert(id, str.ToStdString());
-}
-
-void ProfilePacketSequenceState::AddMapping(SourceMappingId id,
-                                            const SourceMapping& mapping) {
-  StackProfileTracker::CreateMappingParams params;
-  if (std::string* str = strings_.Find(mapping.build_id); str) {
-    params.build_id = base::StringView(*str);
-  } else {
-    context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
-    return;
-  }
-  params.exact_offset = mapping.exact_offset;
-  params.start_offset = mapping.start_offset;
-  params.start = mapping.start;
-  params.end = mapping.end;
-  params.load_bias = mapping.load_bias;
-
-  std::vector<base::StringView> path_components;
-  path_components.reserve(mapping.name_ids.size());
-  for (SourceStringId string_id : mapping.name_ids) {
-    if (std::string* str = strings_.Find(string_id); str) {
-      path_components.push_back(base::StringView(*str));
-    } else {
-      context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
-      return;
-    }
-  }
-  std::string path = ProfilePacketUtils::MakeMappingName(path_components);
-  params.name = base::StringView(path);
-  MappingId mapping_id = context_->stack_profile_tracker->InternMapping(params);
-  mappings_.Insert(id, mapping_id);
-}
-
-void ProfilePacketSequenceState::AddFrame(SourceFrameId id,
-                                          const SourceFrame& frame) {
-  MappingId* mapping_id = mappings_.Find(frame.mapping_id);
-  if (!mapping_id) {
-    context_->storage->IncrementStats(stats::stackprofile_invalid_mapping_id);
-    return;
-  }
-
-  std::string* function_name = strings_.Find(frame.name_id);
-  if (!function_name) {
-    context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
-    return;
-  }
-
-  FrameId frame_id = context_->stack_profile_tracker->InternFrame(
-      *mapping_id, frame.rel_pc, base::StringView(*function_name));
-
-  frames_.Insert(id, frame_id);
-}
-
-void ProfilePacketSequenceState::AddCallstack(
-    SourceCallstackId id,
-    const SourceCallstack& callstack) {
-  std::optional<CallsiteId> parent_callsite_id;
-  uint32_t depth = 0;
-  for (SourceFrameId source_frame_id : callstack) {
-    FrameId* frame_id = frames_.Find(source_frame_id);
-    if (!frame_id) {
-      context_->storage->IncrementStats(stats::stackprofile_invalid_frame_id);
-      return;
-    }
-    parent_callsite_id = context_->stack_profile_tracker->InternCallsite(
-        parent_callsite_id, *frame_id, depth);
-    ++depth;
-  }
-
-  if (!parent_callsite_id) {
-    context_->storage->IncrementStats(stats::stackprofile_empty_callstack);
-    return;
-  }
-
-  callstacks_.Insert(id, *parent_callsite_id);
-}
-
-void ProfilePacketSequenceState::StoreAllocation(
-    const SourceAllocation& alloc) {
-  pending_allocs_.push_back(std::move(alloc));
-}
-
-void ProfilePacketSequenceState::CommitAllocations() {
-  for (const SourceAllocation& alloc : pending_allocs_)
-    AddAllocation(alloc);
-  pending_allocs_.clear();
-}
-
-void ProfilePacketSequenceState::FinalizeProfile() {
-  CommitAllocations();
-  strings_.Clear();
-  mappings_.Clear();
-  frames_.Clear();
-  callstacks_.Clear();
-}
-
-FrameId ProfilePacketSequenceState::GetDatabaseFrameIdForTesting(
-    SourceFrameId source_frame_id) {
-  FrameId* frame_id = frames_.Find(source_frame_id);
-  if (!frame_id) {
-    PERFETTO_DLOG("Invalid frame.");
-    return {};
-  }
-  return *frame_id;
-}
-
-void ProfilePacketSequenceState::AddAllocation(const SourceAllocation& alloc) {
-  auto opt_callstack_id = FindOrInsertCallstack(alloc.callstack_id);
-  if (!opt_callstack_id)
-    return;
-
-  CallsiteId callstack_id = *opt_callstack_id;
-
-  UniquePid upid = context_->process_tracker->GetOrCreateProcess(
-      static_cast<uint32_t>(alloc.pid));
-
-  tables::HeapProfileAllocationTable::Row alloc_row{
-      alloc.timestamp,
-      upid,
-      alloc.heap_name,
-      callstack_id,
-      static_cast<int64_t>(alloc.alloc_count),
-      static_cast<int64_t>(alloc.self_allocated)};
-
-  tables::HeapProfileAllocationTable::Row free_row{
-      alloc.timestamp,
-      upid,
-      alloc.heap_name,
-      callstack_id,
-      -static_cast<int64_t>(alloc.free_count),
-      -static_cast<int64_t>(alloc.self_freed)};
-
-  auto* prev_alloc = prev_alloc_.Find({upid, callstack_id});
-  if (!prev_alloc) {
-    prev_alloc = prev_alloc_
-                     .Insert(std::make_pair(upid, callstack_id),
-                             tables::HeapProfileAllocationTable::Row{})
-                     .first;
-  }
-
-  auto* prev_free = prev_free_.Find({upid, callstack_id});
-  if (!prev_free) {
-    prev_free = prev_free_
-                    .Insert(std::make_pair(upid, callstack_id),
-                            tables::HeapProfileAllocationTable::Row{})
-                    .first;
-  }
-
-  base::FlatSet<CallsiteId>& callstacks_for_source_callstack_id =
-      seen_callstacks_[SourceAllocationIndex{upid, alloc.callstack_id,
-                                             alloc.heap_name}];
-  bool new_callstack;
-  std::tie(std::ignore, new_callstack) =
-      callstacks_for_source_callstack_id.insert(callstack_id);
-
-  if (new_callstack) {
-    alloc_correction_[alloc.callstack_id] = *prev_alloc;
-    free_correction_[alloc.callstack_id] = *prev_free;
-  }
-
-  const auto* alloc_correction = alloc_correction_.Find(alloc.callstack_id);
-  if (alloc_correction) {
-    alloc_row.count += alloc_correction->count;
-    alloc_row.size += alloc_correction->size;
-  }
-
-  const auto* free_correction = free_correction_.Find(alloc.callstack_id);
-  if (free_correction) {
-    free_row.count += free_correction->count;
-    free_row.size += free_correction->size;
-  }
-
-  tables::HeapProfileAllocationTable::Row alloc_delta = alloc_row;
-  tables::HeapProfileAllocationTable::Row free_delta = free_row;
-
-  alloc_delta.count -= prev_alloc->count;
-  alloc_delta.size -= prev_alloc->size;
-
-  free_delta.count -= prev_free->count;
-  free_delta.size -= prev_free->size;
-
-  if (alloc_delta.count < 0 || alloc_delta.size < 0 || free_delta.count > 0 ||
-      free_delta.size > 0) {
-    PERFETTO_DLOG("Non-monotonous allocation.");
-    context_->storage->IncrementIndexedStats(stats::heapprofd_malformed_packet,
-                                             static_cast<int>(upid));
-    return;
-  }
-
-  // Dump at max profiles do not have .count set.
-  if (alloc_delta.count || alloc_delta.size) {
-    context_->storage->mutable_heap_profile_allocation_table()->Insert(
-        alloc_delta);
-  }
-
-  // ART only reports allocations, and not frees. This throws off our logic
-  // that assumes that if a new object was allocated with the same address,
-  // the old one has to have been freed in the meantime.
-  // See HeapTracker::RecordMalloc in bookkeeping.cc.
-  if (context_->storage->GetString(alloc.heap_name) != kArtHeapName &&
-      (free_delta.count || free_delta.size)) {
-    context_->storage->mutable_heap_profile_allocation_table()->Insert(
-        free_delta);
-  }
-
-  *prev_alloc = alloc_row;
-  *prev_free = free_row;
-}
-
-std::optional<CallsiteId> ProfilePacketSequenceState::FindOrInsertCallstack(
-    uint64_t iid) {
-  if (CallsiteId* id = callstacks_.Find(iid); id) {
-    return *id;
-  }
-  return GetOrCreate<StackProfileSequenceState>()->FindOrInsertCallstack(iid);
-}
-
-}  // namespace trace_processor
-}  // namespace perfetto
diff --git a/src/trace_processor/importers/proto/profile_packet_sequence_state.h b/src/trace_processor/importers/proto/profile_packet_sequence_state.h
deleted file mode 100644
index 678aab2..0000000
--- a/src/trace_processor/importers/proto/profile_packet_sequence_state.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2019 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.
- */
-
-#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILE_PACKET_SEQUENCE_STATE_H_
-#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILE_PACKET_SEQUENCE_STATE_H_
-
-#include <cstdint>
-#include "perfetto/base/flat_set.h"
-#include "perfetto/ext/base/flat_hash_map.h"
-
-#include "perfetto/ext/base/hash.h"
-#include "perfetto/ext/base/string_view.h"
-#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
-#include "src/trace_processor/importers/proto/stack_profile_sequence_state.h"
-#include "src/trace_processor/storage/trace_storage.h"
-
-namespace perfetto {
-namespace trace_processor {
-
-// Keeps sequence specific state for profile packets.
-class ProfilePacketSequenceState final
-    : public PacketSequenceStateGeneration::InternedDataTracker {
- public:
-  using SourceStringId = uint64_t;
-
-  struct SourceMapping {
-    SourceStringId build_id = 0;
-    uint64_t exact_offset = 0;
-    uint64_t start_offset = 0;
-    uint64_t start = 0;
-    uint64_t end = 0;
-    uint64_t load_bias = 0;
-    std::vector<SourceStringId> name_ids;
-  };
-  using SourceMappingId = uint64_t;
-
-  struct SourceFrame {
-    SourceStringId name_id = 0;
-    SourceMappingId mapping_id = 0;
-    uint64_t rel_pc = 0;
-  };
-  using SourceFrameId = uint64_t;
-
-  using SourceCallstack = std::vector<SourceFrameId>;
-  using SourceCallstackId = uint64_t;
-  struct SourceAllocation {
-    uint64_t pid = 0;
-    // This is int64_t, because we get this from the TraceSorter which also
-    // converts this for us.
-    int64_t timestamp = 0;
-    StringId heap_name;
-    uint64_t callstack_id = 0;
-    uint64_t self_allocated = 0;
-    uint64_t self_freed = 0;
-    uint64_t alloc_count = 0;
-    uint64_t free_count = 0;
-  };
-
-  explicit ProfilePacketSequenceState(TraceProcessorContext* context);
-  virtual ~ProfilePacketSequenceState() override;
-
-  // Profile packets keep track of a index to detect packet loss. Call this
-  // method to update this index with the latest seen value.
-  void SetProfilePacketIndex(uint64_t index);
-
-  // In Android version Q we did not intern Mappings, Frames nor Callstacks,
-  // instead the profile packed "interned these". The following methods are used
-  // to support this old use case. They add the given object to a sequence local
-  // index for them to be retrieved later (see Find* Lookup* methods).
-  void AddString(SourceStringId id, base::StringView str);
-  void AddMapping(SourceMappingId id, const SourceMapping& mapping);
-  void AddFrame(SourceFrameId id, const SourceFrame& frame);
-  void AddCallstack(SourceCallstackId id, const SourceCallstack& callstack);
-
-  void StoreAllocation(const SourceAllocation& allocation);
-  void FinalizeProfile();
-  void CommitAllocations();
-
-  FrameId GetDatabaseFrameIdForTesting(SourceFrameId);
-
- private:
-  struct SourceAllocationIndex {
-    UniquePid upid;
-    SourceCallstackId src_callstack_id;
-    StringPool::Id heap_name;
-    bool operator==(const SourceAllocationIndex& o) const {
-      return std::tie(upid, src_callstack_id, heap_name) ==
-             std::tie(o.upid, o.src_callstack_id, o.heap_name);
-    }
-    struct Hasher {
-      size_t operator()(const SourceAllocationIndex& o) const {
-        return static_cast<size_t>(base::Hasher::Combine(
-            o.upid, o.src_callstack_id, o.heap_name.raw_id()));
-      }
-    };
-  };
-
-  void AddAllocation(const SourceAllocation& alloc);
-
-  // The following methods deal with interned data. In Android version Q we did
-  // not intern Mappings, Frames nor Callstacks, instead the profile packed
-  // "interned these" and this class keeps those ina  sequence local index. In
-  // newer versions, these objects are in InternedData (see
-  // protos/perfetto/trace/interned_data) and are shared across multiple
-  // ProfilePackets. For backwards compatibility, the following methods first
-  // look up interned data in the private sequence local index (for values added
-  // via the Add* methods), and then, if this lookup fails, in the InternedData
-  // instead.
-  std::optional<MappingId> FindOrInsertMapping(uint64_t iid);
-  std::optional<CallsiteId> FindOrInsertCallstack(uint64_t iid);
-
-  TraceProcessorContext* const context_;
-
-  base::FlatHashMap<SourceStringId, std::string> strings_;
-  base::FlatHashMap<SourceMappingId, MappingId> mappings_;
-  base::FlatHashMap<SourceFrameId, FrameId> frames_;
-  base::FlatHashMap<SourceCallstackId, CallsiteId> callstacks_;
-
-  std::vector<SourceAllocation> pending_allocs_;
-
-  struct Hasher {
-    size_t operator()(const std::pair<UniquePid, CallsiteId>& p) const {
-      return static_cast<size_t>(
-          base::Hasher::Combine(p.first, p.second.value));
-    }
-  };
-  base::FlatHashMap<std::pair<UniquePid, CallsiteId>,
-                    tables::HeapProfileAllocationTable::Row,
-                    Hasher>
-      prev_alloc_;
-  base::FlatHashMap<std::pair<UniquePid, CallsiteId>,
-                    tables::HeapProfileAllocationTable::Row,
-                    Hasher>
-      prev_free_;
-
-  // For continuous dumps, we only store the delta in the data-base. To do
-  // this, we subtract the previous dump's value. Sometimes, we should not
-  // do that subtraction, because heapprofd garbage collects stacks that
-  // have no unfreed allocations. If the application then allocations again
-  // at that stack, it gets recreated and initialized to zero.
-  //
-  // To correct for this, we add the previous' stacks value to the current
-  // one, and then handle it as normal. If it is the first time we see a
-  // SourceCallstackId for a CallsiteId, we put the previous value into
-  // the correction maps below.
-  base::FlatHashMap<SourceAllocationIndex,
-                    base::FlatSet<CallsiteId>,
-                    SourceAllocationIndex::Hasher>
-      seen_callstacks_;
-  base::FlatHashMap<SourceCallstackId, tables::HeapProfileAllocationTable::Row>
-      alloc_correction_;
-  base::FlatHashMap<SourceCallstackId, tables::HeapProfileAllocationTable::Row>
-      free_correction_;
-
-  std::optional<uint64_t> prev_index;
-};
-
-}  // namespace trace_processor
-}  // namespace perfetto
-
-#endif  // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILE_PACKET_SEQUENCE_STATE_H_
diff --git a/src/trace_processor/importers/proto/profile_packet_utils.cc b/src/trace_processor/importers/proto/profile_packet_utils.cc
index 3cc5dc1..9478db9 100644
--- a/src/trace_processor/importers/proto/profile_packet_utils.cc
+++ b/src/trace_processor/importers/proto/profile_packet_utils.cc
@@ -15,27 +15,11 @@
  */
 
 #include "src/trace_processor/importers/proto/profile_packet_utils.h"
-#include "perfetto/ext/base/string_utils.h"
 
 namespace perfetto {
 namespace trace_processor {
 
-// static
-std::string ProfilePacketUtils::MakeMappingName(
-    const std::vector<base::StringView>& path_components) {
-  std::string name;
-  for (base::StringView p : path_components) {
-    name.push_back('/');
-    name.append(p.data(), p.size());
-  }
-
-  // When path strings just have single full path(like Chrome does), the mapping
-  // path gets an extra '/' prepended, strip the extra '/'.
-  if (base::StartsWith(name, "//")) {
-    name = name.substr(1);
-  }
-  return name;
-}
+ProfilePacketInternLookup::~ProfilePacketInternLookup() = default;
 
 }  // namespace trace_processor
 }  // namespace perfetto
diff --git a/src/trace_processor/importers/proto/profile_packet_utils.h b/src/trace_processor/importers/proto/profile_packet_utils.h
index a9ea0e6..64b2c50 100644
--- a/src/trace_processor/importers/proto/profile_packet_utils.h
+++ b/src/trace_processor/importers/proto/profile_packet_utils.h
@@ -20,7 +20,7 @@
 
 #include "perfetto/ext/base/string_view.h"
 #include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/importers/proto/profile_packet_sequence_state.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
 
 #include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
 #include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
@@ -31,12 +31,9 @@
 
 class ProfilePacketUtils {
  public:
-  static std::string MakeMappingName(
-      const std::vector<base::StringView>& path_components);
-
-  static ProfilePacketSequenceState::SourceMapping MakeSourceMapping(
+  static SequenceStackProfileTracker::SourceMapping MakeSourceMapping(
       const protos::pbzero::Mapping::Decoder& entry) {
-    ProfilePacketSequenceState::SourceMapping src_mapping{};
+    SequenceStackProfileTracker::SourceMapping src_mapping{};
     src_mapping.build_id = entry.build_id();
     src_mapping.exact_offset = entry.exact_offset();
     src_mapping.start_offset = entry.start_offset();
@@ -50,18 +47,18 @@
     return src_mapping;
   }
 
-  static ProfilePacketSequenceState::SourceFrame MakeSourceFrame(
+  static SequenceStackProfileTracker::SourceFrame MakeSourceFrame(
       const protos::pbzero::Frame::Decoder& entry) {
-    ProfilePacketSequenceState::SourceFrame src_frame;
+    SequenceStackProfileTracker::SourceFrame src_frame;
     src_frame.name_id = entry.function_name_id();
     src_frame.mapping_id = entry.mapping_id();
     src_frame.rel_pc = entry.rel_pc();
     return src_frame;
   }
 
-  static ProfilePacketSequenceState::SourceCallstack MakeSourceCallstack(
+  static SequenceStackProfileTracker::SourceCallstack MakeSourceCallstack(
       const protos::pbzero::Callstack::Decoder& entry) {
-    ProfilePacketSequenceState::SourceCallstack src_callstack;
+    SequenceStackProfileTracker::SourceCallstack src_callstack;
     for (auto frame_it = entry.frame_ids(); frame_it; ++frame_it)
       src_callstack.emplace_back(*frame_it);
     return src_callstack;
@@ -129,6 +126,76 @@
   }
 };
 
+class ProfilePacketInternLookup
+    : public SequenceStackProfileTracker::InternLookup {
+ public:
+  explicit ProfilePacketInternLookup(PacketSequenceStateGeneration* seq_state)
+      : seq_state_(seq_state) {}
+  ~ProfilePacketInternLookup() override;
+
+  std::optional<base::StringView> GetString(
+      SequenceStackProfileTracker::SourceStringId iid,
+      SequenceStackProfileTracker::InternedStringType type) const override {
+    protos::pbzero::InternedString::Decoder* decoder = nullptr;
+    switch (type) {
+      case SequenceStackProfileTracker::InternedStringType::kBuildId:
+        decoder = seq_state_->LookupInternedMessage<
+            protos::pbzero::InternedData::kBuildIdsFieldNumber,
+            protos::pbzero::InternedString>(iid);
+        break;
+      case SequenceStackProfileTracker::InternedStringType::kFunctionName:
+        decoder = seq_state_->LookupInternedMessage<
+            protos::pbzero::InternedData::kFunctionNamesFieldNumber,
+            protos::pbzero::InternedString>(iid);
+        break;
+      case SequenceStackProfileTracker::InternedStringType::kMappingPath:
+        decoder = seq_state_->LookupInternedMessage<
+            protos::pbzero::InternedData::kMappingPathsFieldNumber,
+            protos::pbzero::InternedString>(iid);
+        break;
+    }
+    if (!decoder)
+      return std::nullopt;
+    return base::StringView(reinterpret_cast<const char*>(decoder->str().data),
+                            decoder->str().size);
+  }
+
+  std::optional<SequenceStackProfileTracker::SourceMapping> GetMapping(
+      SequenceStackProfileTracker::SourceMappingId iid) const override {
+    auto* decoder = seq_state_->LookupInternedMessage<
+        protos::pbzero::InternedData::kMappingsFieldNumber,
+        protos::pbzero::Mapping>(iid);
+    if (!decoder)
+      return std::nullopt;
+    return ProfilePacketUtils::MakeSourceMapping(*decoder);
+  }
+
+  std::optional<SequenceStackProfileTracker::SourceFrame> GetFrame(
+      SequenceStackProfileTracker::SourceFrameId iid) const override {
+    auto* decoder = seq_state_->LookupInternedMessage<
+        protos::pbzero::InternedData::kFramesFieldNumber,
+        protos::pbzero::Frame>(iid);
+    if (!decoder)
+      return std::nullopt;
+    return ProfilePacketUtils::MakeSourceFrame(*decoder);
+  }
+
+  std::optional<SequenceStackProfileTracker::SourceCallstack> GetCallstack(
+      SequenceStackProfileTracker::SourceCallstackId iid) const override {
+    auto* interned_message_view = seq_state_->GetInternedMessageView(
+        protos::pbzero::InternedData::kCallstacksFieldNumber, iid);
+    if (!interned_message_view)
+      return std::nullopt;
+    protos::pbzero::Callstack::Decoder decoder(
+        interned_message_view->message().data(),
+        interned_message_view->message().length());
+    return ProfilePacketUtils::MakeSourceCallstack(std::move(decoder));
+  }
+
+ private:
+  PacketSequenceStateGeneration* seq_state_;
+};
+
 }  // namespace trace_processor
 }  // namespace perfetto
 
diff --git a/src/trace_processor/util/profiler_util.cc b/src/trace_processor/importers/proto/profiler_util.cc
similarity index 98%
rename from src/trace_processor/util/profiler_util.cc
rename to src/trace_processor/importers/proto/profiler_util.cc
index 71c3c25..79a5448 100644
--- a/src/trace_processor/util/profiler_util.cc
+++ b/src/trace_processor/importers/proto/profiler_util.cc
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "src/trace_processor/util/profiler_util.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
 #include <optional>
 
 #include "perfetto/ext/base/string_utils.h"
diff --git a/src/trace_processor/util/profiler_util.h b/src/trace_processor/importers/proto/profiler_util.h
similarity index 86%
rename from src/trace_processor/util/profiler_util.h
rename to src/trace_processor/importers/proto/profiler_util.h
index 3af3606..cbf8ad1 100644
--- a/src/trace_processor/util/profiler_util.h
+++ b/src/trace_processor/importers/proto/profiler_util.h
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#ifndef SRC_TRACE_PROCESSOR_UTIL_PROFILER_UTIL_H_
-#define SRC_TRACE_PROCESSOR_UTIL_PROFILER_UTIL_H_
+#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILER_UTIL_H_
+#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILER_UTIL_H_
 
 #include <optional>
 #include <string>
@@ -38,4 +38,4 @@
 }  // namespace trace_processor
 }  // namespace perfetto
 
-#endif  // SRC_TRACE_PROCESSOR_UTIL_PROFILER_UTIL_H_
+#endif  // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILER_UTIL_H_
diff --git a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
index 148bf60..af96d34 100644
--- a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
+++ b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
@@ -28,12 +28,12 @@
 #include "src/trace_processor/importers/common/metadata_tracker.h"
 #include "src/trace_processor/importers/common/process_tracker.h"
 #include "src/trace_processor/importers/common/slice_tracker.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
 #include "src/trace_processor/importers/common/track_tracker.h"
 #include "src/trace_processor/importers/ftrace/sched_event_tracker.h"
 #include "src/trace_processor/importers/proto/additional_modules.h"
 #include "src/trace_processor/importers/proto/default_modules.h"
 #include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
 #include "src/trace_processor/sorter/trace_sorter.h"
 #include "src/trace_processor/storage/metadata.h"
 #include "src/trace_processor/storage/trace_storage.h"
@@ -55,7 +55,6 @@
 #include "protos/perfetto/trace/ftrace/sched.pbzero.h"
 #include "protos/perfetto/trace/ftrace/task.pbzero.h"
 #include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
-#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
 #include "protos/perfetto/trace/profiling/profile_packet.pbzero.h"
 #include "protos/perfetto/trace/ps/process_tree.pbzero.h"
 #include "protos/perfetto/trace/sys_stats/sys_stats.pbzero.h"
@@ -252,7 +251,8 @@
     context_.track_tracker.reset(new TrackTracker(&context_));
     context_.global_args_tracker.reset(
         new GlobalArgsTracker(context_.storage.get()));
-    context_.stack_profile_tracker.reset(new StackProfileTracker(&context_));
+    context_.global_stack_profile_tracker.reset(
+        new GlobalStackProfileTracker());
     context_.args_tracker.reset(new ArgsTracker(&context_));
     context_.args_translation_table.reset(new ArgsTranslationTable(storage_));
     context_.metadata_tracker.reset(
diff --git a/src/trace_processor/importers/proto/proto_trace_reader.h b/src/trace_processor/importers/proto/proto_trace_reader.h
index 8afc40c..1c554a6 100644
--- a/src/trace_processor/importers/proto/proto_trace_reader.h
+++ b/src/trace_processor/importers/proto/proto_trace_reader.h
@@ -24,7 +24,6 @@
 #include "src/trace_processor/importers/common/chunked_trace_reader.h"
 #include "src/trace_processor/importers/proto/proto_incremental_state.h"
 #include "src/trace_processor/importers/proto/proto_trace_tokenizer.h"
-#include "src/trace_processor/storage/trace_storage.h"
 
 namespace protozero {
 struct ConstBytes;
diff --git a/src/trace_processor/importers/proto/stack_profile_sequence_state.cc b/src/trace_processor/importers/proto/stack_profile_sequence_state.cc
deleted file mode 100644
index 693a1ed..0000000
--- a/src/trace_processor/importers/proto/stack_profile_sequence_state.cc
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2019 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.
- */
-
-#include "src/trace_processor/importers/proto/stack_profile_sequence_state.h"
-
-#include <optional>
-#include <vector>
-
-#include "perfetto/base/logging.h"
-#include "perfetto/ext/base/string_view.h"
-#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
-#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
-#include "src/trace_processor/importers/proto/profile_packet_utils.h"
-#include "src/trace_processor/storage/stats.h"
-#include "src/trace_processor/storage/trace_storage.h"
-#include "src/trace_processor/types/trace_processor_context.h"
-
-namespace perfetto {
-namespace trace_processor {
-namespace {
-base::StringView ToStringView(protozero::ConstBytes bytes) {
-  return base::StringView(reinterpret_cast<const char*>(bytes.data),
-                          bytes.size);
-}
-}  // namespace
-
-StackProfileSequenceState::StackProfileSequenceState(
-    TraceProcessorContext* context)
-    : context_(context) {}
-
-StackProfileSequenceState::~StackProfileSequenceState() = default;
-
-std::optional<MappingId> StackProfileSequenceState::FindOrInsertMapping(
-    uint64_t iid) {
-  if (MappingId* id = cached_mappings_.Find(iid); id) {
-    return *id;
-  }
-  auto* decoder =
-      LookupInternedMessage<protos::pbzero::InternedData::kMappingsFieldNumber,
-                            protos::pbzero::Mapping>(iid);
-  if (!decoder) {
-    context_->storage->IncrementStats(stats::stackprofile_invalid_mapping_id);
-    return std::nullopt;
-  }
-
-  base::StringView build_id;
-  if (decoder->has_build_id()) {
-    std::optional<base::StringView> maybe_build_id =
-        LookupInternedBuildId(decoder->build_id());
-    if (!maybe_build_id) {
-      return std::nullopt;
-    }
-    build_id = *maybe_build_id;
-  }
-
-  std::vector<base::StringView> path_components;
-  for (auto it = decoder->path_string_ids(); it; ++it) {
-    std::optional<base::StringView> str = LookupInternedMappingPath(*it);
-    if (!str) {
-      return std::nullopt;
-    }
-    path_components.push_back(*str);
-  }
-  std::string path = ProfilePacketUtils::MakeMappingName(path_components);
-
-  StackProfileTracker::CreateMappingParams params;
-  params.build_id = build_id;
-  params.exact_offset = decoder->exact_offset();
-  params.start_offset = decoder->start_offset();
-  params.start = decoder->start();
-  params.end = decoder->end();
-  params.load_bias = decoder->load_bias();
-  params.name = base::StringView(path);
-  MappingId mapping_id = context_->stack_profile_tracker->InternMapping(params);
-  cached_mappings_.Insert(iid, mapping_id);
-  return mapping_id;
-}
-
-std::optional<base::StringView>
-StackProfileSequenceState::LookupInternedBuildId(uint64_t iid) {
-  auto* decoder =
-      LookupInternedMessage<protos::pbzero::InternedData::kBuildIdsFieldNumber,
-                            protos::pbzero::InternedString>(iid);
-  if (!decoder) {
-    context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
-    return std::nullopt;
-  }
-
-  return ToStringView(decoder->str());
-}
-
-std::optional<base::StringView>
-StackProfileSequenceState::LookupInternedMappingPath(uint64_t iid) {
-  auto* decoder =
-
-      LookupInternedMessage<
-          protos::pbzero::InternedData::kMappingPathsFieldNumber,
-          protos::pbzero::InternedString>(iid);
-  if (!decoder) {
-    context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
-    return std::nullopt;
-  }
-
-  return ToStringView(decoder->str());
-}
-
-std::optional<CallsiteId> StackProfileSequenceState::FindOrInsertCallstack(
-    uint64_t iid) {
-  if (CallsiteId* id = cached_callstacks_.Find(iid); id) {
-    return *id;
-  }
-  auto* decoder = LookupInternedMessage<
-      protos::pbzero::InternedData::kCallstacksFieldNumber,
-      protos::pbzero::Callstack>(iid);
-  if (!decoder) {
-    context_->storage->IncrementStats(stats::stackprofile_invalid_callstack_id);
-    return std::nullopt;
-  }
-
-  std::optional<CallsiteId> parent_callsite_id;
-  uint32_t depth = 0;
-  for (auto it = decoder->frame_ids(); it; ++it) {
-    std::optional<FrameId> frame_id = FindOrInsertFrame(*it);
-    if (!frame_id) {
-      return std::nullopt;
-    }
-    parent_callsite_id = context_->stack_profile_tracker->InternCallsite(
-        parent_callsite_id, *frame_id, depth);
-    ++depth;
-  }
-
-  if (!parent_callsite_id) {
-    context_->storage->IncrementStats(stats::stackprofile_empty_callstack);
-    return std::nullopt;
-  }
-
-  cached_callstacks_.Insert(iid, *parent_callsite_id);
-
-  return *parent_callsite_id;
-}
-
-std::optional<FrameId> StackProfileSequenceState::FindOrInsertFrame(
-    uint64_t iid) {
-  if (FrameId* id = cached_frames_.Find(iid); id) {
-    return *id;
-  }
-  auto* decoder =
-      LookupInternedMessage<protos::pbzero::InternedData::kFramesFieldNumber,
-                            protos::pbzero::Frame>(iid);
-  if (!decoder) {
-    context_->storage->IncrementStats(stats::stackprofile_invalid_frame_id);
-    return std::nullopt;
-  }
-
-  std::optional<MappingId> mapping_id =
-      FindOrInsertMapping(decoder->mapping_id());
-  if (!mapping_id) {
-    return std::nullopt;
-  }
-
-  base::StringView function_name;
-  if (decoder->function_name_id() != 0) {
-    std::optional<base::StringView> func =
-        LookupInternedFunctionName(decoder->function_name_id());
-    if (!func) {
-      return std::nullopt;
-    }
-    function_name = *func;
-  }
-
-  FrameId frame_id = context_->stack_profile_tracker->InternFrame(
-      *mapping_id, decoder->rel_pc(), function_name);
-
-  cached_frames_.Insert(iid, frame_id);
-
-  return frame_id;
-}
-
-std::optional<base::StringView>
-StackProfileSequenceState::LookupInternedFunctionName(uint64_t iid) {
-  auto* decoder = LookupInternedMessage<
-      protos::pbzero::InternedData::kFunctionNamesFieldNumber,
-      protos::pbzero::InternedString>(iid);
-  if (!decoder) {
-    context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
-    return std::nullopt;
-  }
-
-  return ToStringView(decoder->str());
-}
-
-}  // namespace trace_processor
-}  // namespace perfetto
diff --git a/src/trace_processor/importers/proto/stack_profile_sequence_state.h b/src/trace_processor/importers/proto/stack_profile_sequence_state.h
deleted file mode 100644
index 7a7879a..0000000
--- a/src/trace_processor/importers/proto/stack_profile_sequence_state.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2019 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.
- */
-
-#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_SEQUENCE_STATE_H_
-#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_SEQUENCE_STATE_H_
-
-#include <cstdint>
-#include <optional>
-
-#include "perfetto/ext/base/flat_hash_map.h"
-#include "perfetto/ext/base/string_view.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
-#include "src/trace_processor/storage/trace_storage.h"
-#include "src/trace_processor/types/trace_processor_context.h"
-
-namespace perfetto {
-namespace trace_processor {
-
-class TraceProcessorContext;
-
-class StackProfileSequenceState final
-    : public PacketSequenceStateGeneration::InternedDataTracker {
- public:
-  explicit StackProfileSequenceState(TraceProcessorContext* context);
-
-  StackProfileSequenceState(const StackProfileSequenceState&);
-
-  virtual ~StackProfileSequenceState() override;
-
-  std::optional<MappingId> FindOrInsertMapping(uint64_t iid);
-  std::optional<CallsiteId> FindOrInsertCallstack(uint64_t iid);
-
- private:
-  std::optional<base::StringView> LookupInternedBuildId(uint64_t iid);
-  std::optional<base::StringView> LookupInternedMappingPath(uint64_t iid);
-  std::optional<base::StringView> LookupInternedFunctionName(uint64_t iid);
-  std::optional<FrameId> FindOrInsertFrame(uint64_t iid);
-
-  TraceProcessorContext* const context_;
-  base::FlatHashMap<uint64_t, MappingId> cached_mappings_;
-  base::FlatHashMap<uint64_t, CallsiteId> cached_callstacks_;
-  base::FlatHashMap<uint64_t, FrameId> cached_frames_;
-};
-
-}  // namespace trace_processor
-}  // namespace perfetto
-
-#endif  // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_SEQUENCE_STATE_H_
diff --git a/src/trace_processor/importers/proto/stack_profile_tracker.cc b/src/trace_processor/importers/proto/stack_profile_tracker.cc
new file mode 100644
index 0000000..d00f287
--- /dev/null
+++ b/src/trace_processor/importers/proto/stack_profile_tracker.cc
@@ -0,0 +1,368 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
+
+#include "perfetto/base/logging.h"
+#include "perfetto/ext/base/string_utils.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
+#include "src/trace_processor/types/trace_processor_context.h"
+#include "src/trace_processor/util/stack_traces_util.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+SequenceStackProfileTracker::InternLookup::~InternLookup() = default;
+
+SequenceStackProfileTracker::SequenceStackProfileTracker(
+    TraceProcessorContext* context)
+    : context_(context), empty_(kNullStringId) {}
+
+SequenceStackProfileTracker::~SequenceStackProfileTracker() = default;
+
+StringId SequenceStackProfileTracker::GetEmptyStringId() {
+  if (empty_ == kNullStringId) {
+    empty_ = context_->storage->InternString({"", 0});
+  }
+
+  return empty_;
+}
+
+void SequenceStackProfileTracker::AddString(SourceStringId id,
+                                            base::StringView str) {
+  string_map_.emplace(id, str.ToStdString());
+}
+
+std::optional<MappingId> SequenceStackProfileTracker::AddMapping(
+    SourceMappingId id,
+    const SourceMapping& mapping,
+    const InternLookup* intern_lookup) {
+  std::string path;
+  for (SourceStringId str_id : mapping.name_ids) {
+    auto opt_str = FindOrInsertString(str_id, intern_lookup,
+                                      InternedStringType::kMappingPath);
+    if (!opt_str)
+      break;
+    path += "/" + *opt_str;
+  }
+  // When path strings just have single full path(like Chrome does), the mapping
+  // path gets an extra '/' prepended, strip the extra '/'.
+  if (base::StartsWith(path, "//")) {
+    path = path.substr(1);
+  }
+
+  auto opt_build_id = FindAndInternString(mapping.build_id, intern_lookup,
+                                          InternedStringType::kBuildId);
+  if (!opt_build_id) {
+    context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
+    PERFETTO_DLOG("Invalid string.");
+    return std::nullopt;
+  }
+  const StringId raw_build_id = opt_build_id.value();
+  NullTermStringView raw_build_id_str =
+      context_->storage->GetString(raw_build_id);
+  StringId build_id = GetEmptyStringId();
+  if (!raw_build_id_str.empty()) {
+    // If the build_id is 33 characters long, we assume it's a Breakpad debug
+    // identifier which is already in Hex and doesn't need conversion.
+    // TODO(b/148109467): Remove workaround once all active Chrome versions
+    // write raw bytes instead of a string as build_id.
+    if (util::IsHexModuleId(raw_build_id_str)) {
+      build_id = raw_build_id;
+    } else {
+      std::string hex_build_id =
+          base::ToHex(raw_build_id_str.c_str(), raw_build_id_str.size());
+      build_id =
+          context_->storage->InternString(base::StringView(hex_build_id));
+    }
+  }
+
+  tables::StackProfileMappingTable::Row row{
+      build_id,
+      static_cast<int64_t>(mapping.exact_offset),
+      static_cast<int64_t>(mapping.start_offset),
+      static_cast<int64_t>(mapping.start),
+      static_cast<int64_t>(mapping.end),
+      static_cast<int64_t>(mapping.load_bias),
+      context_->storage->InternString(base::StringView(path))};
+
+  tables::StackProfileMappingTable* mappings =
+      context_->storage->mutable_stack_profile_mapping_table();
+  std::optional<MappingId> cur_id;
+  auto it = mapping_idx_.find(row);
+  if (it != mapping_idx_.end()) {
+    cur_id = it->second;
+  } else {
+    std::vector<MappingId> db_mappings =
+        context_->global_stack_profile_tracker->FindMappingRow(row.name,
+                                                               row.build_id);
+    for (const MappingId preexisting_mapping : db_mappings) {
+      uint32_t preexisting_row = *mappings->id().IndexOf(preexisting_mapping);
+      tables::StackProfileMappingTable::Row preexisting_data{
+          mappings->build_id()[preexisting_row],
+          mappings->exact_offset()[preexisting_row],
+          mappings->start_offset()[preexisting_row],
+          mappings->start()[preexisting_row],
+          mappings->end()[preexisting_row],
+          mappings->load_bias()[preexisting_row],
+          mappings->name()[preexisting_row]};
+
+      if (row == preexisting_data) {
+        cur_id = preexisting_mapping;
+      }
+    }
+    if (!cur_id) {
+      MappingId mapping_id = mappings->Insert(row).id;
+      context_->global_stack_profile_tracker->InsertMappingId(
+          row.name, row.build_id, mapping_id);
+      cur_id = mapping_id;
+    }
+    mapping_idx_.emplace(row, *cur_id);
+  }
+  mapping_ids_.emplace(id, *cur_id);
+  return cur_id;
+}
+
+std::optional<FrameId> SequenceStackProfileTracker::AddFrame(
+    SourceFrameId id,
+    const SourceFrame& frame,
+    const InternLookup* intern_lookup) {
+  std::optional<std::string> opt_name = FindOrInsertString(
+      frame.name_id, intern_lookup, InternedStringType::kFunctionName);
+  if (!opt_name) {
+    context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
+    PERFETTO_DLOG("Invalid string.");
+    return std::nullopt;
+  }
+  const std::string& name = *opt_name;
+  const StringId str_id =
+      context_->storage->InternString(base::StringView(name));
+
+  auto opt_mapping = FindOrInsertMapping(frame.mapping_id, intern_lookup);
+  if (!opt_mapping) {
+    context_->storage->IncrementStats(stats::stackprofile_invalid_mapping_id);
+    return std::nullopt;
+  }
+  MappingId mapping_id = *opt_mapping;
+  const auto& mappings = context_->storage->stack_profile_mapping_table();
+  StringId mapping_name_id =
+      mappings.name()[*mappings.id().IndexOf(mapping_id)];
+  auto mapping_name = context_->storage->GetString(mapping_name_id);
+
+  tables::StackProfileFrameTable::Row row{str_id, mapping_id,
+                                          static_cast<int64_t>(frame.rel_pc)};
+
+  auto* frames = context_->storage->mutable_stack_profile_frame_table();
+
+  std::optional<FrameId> cur_id;
+  auto it = frame_idx_.find(row);
+  if (it != frame_idx_.end()) {
+    cur_id = it->second;
+  } else {
+    std::vector<FrameId> db_frames =
+        context_->global_stack_profile_tracker->FindFrameIds(mapping_id,
+                                                             frame.rel_pc);
+    for (const FrameId preexisting_frame : db_frames) {
+      uint32_t preexisting_row_id = *frames->id().IndexOf(preexisting_frame);
+      tables::StackProfileFrameTable::Row preexisting_row{
+          frames->name()[preexisting_row_id],
+          frames->mapping()[preexisting_row_id],
+          frames->rel_pc()[preexisting_row_id]};
+
+      if (row == preexisting_row) {
+        cur_id = preexisting_frame;
+      }
+    }
+    if (!cur_id) {
+      cur_id = frames->Insert(row).id;
+      context_->global_stack_profile_tracker->InsertFrameRow(
+          mapping_id, static_cast<uint64_t>(row.rel_pc), *cur_id);
+      if (base::Contains(name, '.')) {
+        // Java frames always contain a '.'
+        std::optional<std::string> package =
+            PackageFromLocation(context_->storage.get(), mapping_name);
+        if (package) {
+          NameInPackage nip{str_id, context_->storage->InternString(
+                                        base::StringView(*package))};
+          context_->global_stack_profile_tracker->InsertJavaFrameForName(
+              nip, *cur_id);
+        } else if (mapping_name.find("/memfd:") == 0) {
+          NameInPackage nip{str_id, context_->storage->InternString("memfd")};
+          context_->global_stack_profile_tracker->InsertJavaFrameForName(
+              nip, *cur_id);
+        }
+      }
+    }
+    frame_idx_.emplace(row, *cur_id);
+  }
+  frame_ids_.emplace(id, *cur_id);
+  return cur_id;
+}
+
+std::optional<CallsiteId> SequenceStackProfileTracker::AddCallstack(
+    SourceCallstackId id,
+    const SourceCallstack& frame_ids,
+    const InternLookup* intern_lookup) {
+  if (frame_ids.empty())
+    return std::nullopt;
+
+  std::optional<CallsiteId> parent_id;
+  for (uint32_t depth = 0; depth < frame_ids.size(); ++depth) {
+    auto opt_frame_id = FindOrInsertFrame(frame_ids[depth], intern_lookup);
+    if (!opt_frame_id) {
+      context_->storage->IncrementStats(stats::stackprofile_invalid_frame_id);
+      return std::nullopt;
+    }
+    FrameId frame_id = *opt_frame_id;
+
+    tables::StackProfileCallsiteTable::Row row{depth, parent_id, frame_id};
+    CallsiteId self_id;
+    auto callsite_it = callsite_idx_.find(row);
+    if (callsite_it != callsite_idx_.end()) {
+      self_id = callsite_it->second;
+    } else {
+      auto* callsite =
+          context_->storage->mutable_stack_profile_callsite_table();
+      self_id = callsite->Insert(row).id;
+      callsite_idx_.emplace(row, self_id);
+    }
+    parent_id = self_id;
+  }
+  PERFETTO_DCHECK(parent_id);  // The loop ran at least once.
+  callstack_ids_.emplace(id, *parent_id);
+  return parent_id;
+}
+
+FrameId SequenceStackProfileTracker::GetDatabaseFrameIdForTesting(
+    SourceFrameId frame_id) {
+  auto it = frame_ids_.find(frame_id);
+  if (it == frame_ids_.end()) {
+    PERFETTO_DLOG("Invalid frame.");
+    return {};
+  }
+  return it->second;
+}
+
+std::optional<StringId> SequenceStackProfileTracker::FindAndInternString(
+    SourceStringId id,
+    const InternLookup* intern_lookup,
+    SequenceStackProfileTracker::InternedStringType type) {
+  if (id == 0)
+    return GetEmptyStringId();
+
+  auto opt_str = FindOrInsertString(id, intern_lookup, type);
+  if (!opt_str)
+    return GetEmptyStringId();
+
+  return context_->storage->InternString(base::StringView(*opt_str));
+}
+
+std::optional<std::string> SequenceStackProfileTracker::FindOrInsertString(
+    SourceStringId id,
+    const InternLookup* intern_lookup,
+    SequenceStackProfileTracker::InternedStringType type) {
+  if (id == 0)
+    return "";
+
+  auto it = string_map_.find(id);
+  if (it == string_map_.end()) {
+    if (intern_lookup) {
+      auto str = intern_lookup->GetString(id, type);
+      if (!str) {
+        context_->storage->IncrementStats(
+            stats::stackprofile_invalid_string_id);
+        PERFETTO_DLOG("Invalid string.");
+        return std::nullopt;
+      }
+      return str->ToStdString();
+    }
+    return std::nullopt;
+  }
+
+  return it->second;
+}
+
+std::optional<MappingId> SequenceStackProfileTracker::FindOrInsertMapping(
+    SourceMappingId mapping_id,
+    const InternLookup* intern_lookup) {
+  std::optional<MappingId> res;
+  auto it = mapping_ids_.find(mapping_id);
+  if (it == mapping_ids_.end()) {
+    if (intern_lookup) {
+      auto interned_mapping = intern_lookup->GetMapping(mapping_id);
+      if (interned_mapping) {
+        res = AddMapping(mapping_id, *interned_mapping, intern_lookup);
+        return res;
+      }
+    }
+    context_->storage->IncrementStats(stats::stackprofile_invalid_mapping_id);
+    return res;
+  }
+  res = it->second;
+  return res;
+}
+
+std::optional<FrameId> SequenceStackProfileTracker::FindOrInsertFrame(
+    SourceFrameId frame_id,
+    const InternLookup* intern_lookup) {
+  std::optional<FrameId> res;
+  auto it = frame_ids_.find(frame_id);
+  if (it == frame_ids_.end()) {
+    if (intern_lookup) {
+      auto interned_frame = intern_lookup->GetFrame(frame_id);
+      if (interned_frame) {
+        res = AddFrame(frame_id, *interned_frame, intern_lookup);
+        return res;
+      }
+    }
+    context_->storage->IncrementStats(stats::stackprofile_invalid_frame_id);
+    PERFETTO_DLOG("Unknown frame %" PRIu64 " : %zu", frame_id,
+                  frame_ids_.size());
+    return res;
+  }
+  res = it->second;
+  return res;
+}
+
+std::optional<CallsiteId> SequenceStackProfileTracker::FindOrInsertCallstack(
+    SourceCallstackId callstack_id,
+    const InternLookup* intern_lookup) {
+  std::optional<CallsiteId> res;
+  auto it = callstack_ids_.find(callstack_id);
+  if (it == callstack_ids_.end()) {
+    auto interned_callstack = intern_lookup->GetCallstack(callstack_id);
+    if (interned_callstack) {
+      res = AddCallstack(callstack_id, *interned_callstack, intern_lookup);
+      return res;
+    }
+    context_->storage->IncrementStats(stats::stackprofile_invalid_callstack_id);
+    PERFETTO_DLOG("Unknown callstack %" PRIu64 " : %zu", callstack_id,
+                  callstack_ids_.size());
+    return res;
+  }
+  res = it->second;
+  return res;
+}
+
+void SequenceStackProfileTracker::ClearIndices() {
+  string_map_.clear();
+  mapping_ids_.clear();
+  callstack_ids_.clear();
+  frame_ids_.clear();
+}
+
+}  // namespace trace_processor
+}  // namespace perfetto
diff --git a/src/trace_processor/importers/proto/stack_profile_tracker.h b/src/trace_processor/importers/proto/stack_profile_tracker.h
new file mode 100644
index 0000000..a29d3c1
--- /dev/null
+++ b/src/trace_processor/importers/proto/stack_profile_tracker.h
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_TRACKER_H_
+#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_TRACKER_H_
+
+#include <deque>
+#include <optional>
+#include <unordered_map>
+
+#include "src/trace_processor/storage/trace_storage.h"
+#include "src/trace_processor/tables/profiler_tables_py.h"
+
+#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
+#include "protos/perfetto/trace/profiling/profile_packet.pbzero.h"
+
+template <>
+struct std::hash<std::pair<uint32_t, int64_t>> {
+  using argument_type = std::pair<uint32_t, int64_t>;
+  using result_type = size_t;
+
+  result_type operator()(const argument_type& p) const {
+    return std::hash<uint32_t>{}(p.first) ^ std::hash<int64_t>{}(p.second);
+  }
+};
+
+template <>
+struct std::hash<std::pair<uint32_t, perfetto::trace_processor::CallsiteId>> {
+  using argument_type =
+      std::pair<uint32_t, perfetto::trace_processor::CallsiteId>;
+  using result_type = size_t;
+
+  result_type operator()(const argument_type& p) const {
+    return std::hash<uint32_t>{}(p.first) ^
+           std::hash<uint32_t>{}(p.second.value);
+  }
+};
+
+template <>
+struct std::hash<std::pair<uint32_t, perfetto::trace_processor::MappingId>> {
+  using argument_type =
+      std::pair<uint32_t, perfetto::trace_processor::MappingId>;
+  using result_type = size_t;
+
+  result_type operator()(const argument_type& p) const {
+    return std::hash<uint32_t>{}(p.first) ^
+           std::hash<uint32_t>{}(p.second.value);
+  }
+};
+
+template <>
+struct std::hash<std::pair<uint32_t, perfetto::trace_processor::FrameId>> {
+  using argument_type = std::pair<uint32_t, perfetto::trace_processor::FrameId>;
+  using result_type = size_t;
+
+  result_type operator()(const argument_type& p) const {
+    return std::hash<uint32_t>{}(p.first) ^
+           std::hash<uint32_t>{}(p.second.value);
+  }
+};
+
+template <>
+struct std::hash<std::vector<uint64_t>> {
+  using argument_type = std::vector<uint64_t>;
+  using result_type = size_t;
+
+  result_type operator()(const argument_type& p) const {
+    size_t h = 0u;
+    for (auto v : p)
+      h = h ^ std::hash<uint64_t>{}(v);
+    return h;
+  }
+};
+
+namespace perfetto {
+namespace trace_processor {
+
+struct NameInPackage {
+  StringId name;
+  StringId package;
+
+  bool operator<(const NameInPackage& b) const {
+    return std::tie(name, package) < std::tie(b.name, b.package);
+  }
+};
+
+class TraceProcessorContext;
+
+class GlobalStackProfileTracker {
+ public:
+  std::vector<MappingId> FindMappingRow(StringId name,
+                                        StringId build_id) const {
+    auto it = stack_profile_mapping_index_.find(std::make_pair(name, build_id));
+    if (it == stack_profile_mapping_index_.end())
+      return {};
+    return it->second;
+  }
+
+  void InsertMappingId(StringId name, StringId build_id, MappingId row) {
+    auto pair = std::make_pair(name, build_id);
+    stack_profile_mapping_index_[pair].emplace_back(row);
+  }
+
+  std::vector<FrameId> FindFrameIds(MappingId mapping_row,
+                                    uint64_t rel_pc) const {
+    auto it =
+        stack_profile_frame_index_.find(std::make_pair(mapping_row, rel_pc));
+    if (it == stack_profile_frame_index_.end())
+      return {};
+    return it->second;
+  }
+
+  void InsertFrameRow(MappingId mapping_row, uint64_t rel_pc, FrameId row) {
+    auto pair = std::make_pair(mapping_row, rel_pc);
+    stack_profile_frame_index_[pair].emplace_back(row);
+  }
+
+  const std::vector<tables::StackProfileFrameTable::Id>* JavaFramesForName(
+      NameInPackage name) {
+    auto it = java_frames_for_name_.find(name);
+    if (it == java_frames_for_name_.end())
+      return nullptr;
+    return &it->second;
+  }
+
+  void InsertJavaFrameForName(NameInPackage name,
+                              tables::StackProfileFrameTable::Id id) {
+    java_frames_for_name_[name].push_back(id);
+  }
+
+ private:
+  using MappingKey = std::pair<StringId /* name */, StringId /* build id */>;
+  std::map<MappingKey, std::vector<MappingId>> stack_profile_mapping_index_;
+
+  using FrameKey = std::pair<MappingId, uint64_t /* rel_pc */>;
+  std::map<FrameKey, std::vector<FrameId>> stack_profile_frame_index_;
+
+  std::map<NameInPackage, std::vector<tables::StackProfileFrameTable::Id>>
+      java_frames_for_name_;
+};
+
+// TODO(lalitm): Overhaul this class to make row vs id consistent and use
+// base::Optional instead of int64_t.
+class SequenceStackProfileTracker {
+ public:
+  using SourceStringId = uint64_t;
+
+  enum class InternedStringType {
+    kMappingPath,
+    kBuildId,
+    kFunctionName,
+  };
+
+  struct SourceMapping {
+    SourceStringId build_id = 0;
+    uint64_t exact_offset = 0;
+    uint64_t start_offset = 0;
+    uint64_t start = 0;
+    uint64_t end = 0;
+    uint64_t load_bias = 0;
+    std::vector<SourceStringId> name_ids;
+  };
+  using SourceMappingId = uint64_t;
+
+  struct SourceFrame {
+    SourceStringId name_id = 0;
+    SourceMappingId mapping_id = 0;
+    uint64_t rel_pc = 0;
+  };
+  using SourceFrameId = uint64_t;
+
+  using SourceCallstack = std::vector<SourceFrameId>;
+  using SourceCallstackId = uint64_t;
+
+  struct SourceAllocation {
+    uint64_t pid = 0;
+    // This is int64_t, because we get this from the TraceSorter which also
+    // converts this for us.
+    int64_t timestamp = 0;
+    SourceCallstackId callstack_id = 0;
+    uint64_t self_allocated = 0;
+    uint64_t self_freed = 0;
+    uint64_t alloc_count = 0;
+    uint64_t free_count = 0;
+  };
+
+  class InternLookup {
+   public:
+    virtual ~InternLookup();
+
+    virtual std::optional<base::StringView> GetString(
+        SourceStringId,
+        InternedStringType) const = 0;
+    virtual std::optional<SourceMapping> GetMapping(SourceMappingId) const = 0;
+    virtual std::optional<SourceFrame> GetFrame(SourceFrameId) const = 0;
+    virtual std::optional<SourceCallstack> GetCallstack(
+        SourceCallstackId) const = 0;
+  };
+
+  explicit SequenceStackProfileTracker(TraceProcessorContext* context);
+  ~SequenceStackProfileTracker();
+
+  void AddString(SourceStringId, base::StringView);
+  std::optional<MappingId> AddMapping(
+      SourceMappingId,
+      const SourceMapping&,
+      const InternLookup* intern_lookup = nullptr);
+  std::optional<FrameId> AddFrame(SourceFrameId,
+                                  const SourceFrame&,
+                                  const InternLookup* intern_lookup = nullptr);
+  std::optional<CallsiteId> AddCallstack(
+      SourceCallstackId,
+      const SourceCallstack&,
+      const InternLookup* intern_lookup = nullptr);
+
+  FrameId GetDatabaseFrameIdForTesting(SourceFrameId);
+
+  // Gets the row number of string / mapping / frame / callstack previously
+  // added through AddString / AddMapping/ AddFrame / AddCallstack.
+  //
+  // If it is not found, look up the string / mapping / frame / callstack in
+  // the global InternedData state, and if found, add to the database, if not
+  // already added before.
+  //
+  // This is to support both ProfilePackets that contain the interned data
+  // (for Android Q) and where the interned data is kept globally in
+  // InternedData (for versions newer than Q).
+  std::optional<StringId> FindAndInternString(SourceStringId,
+                                              const InternLookup* intern_lookup,
+                                              InternedStringType type);
+  std::optional<std::string> FindOrInsertString(
+      SourceStringId,
+      const InternLookup* intern_lookup,
+      InternedStringType type);
+  std::optional<MappingId> FindOrInsertMapping(
+      SourceMappingId,
+      const InternLookup* intern_lookup);
+  std::optional<FrameId> FindOrInsertFrame(SourceFrameId,
+                                           const InternLookup* intern_lookup);
+
+  std::optional<CallsiteId> FindOrInsertCallstack(
+      SourceCallstackId,
+      const InternLookup* intern_lookup);
+
+  // Clear indices when they're no longer needed.
+  void ClearIndices();
+
+ private:
+  StringId GetEmptyStringId();
+
+  std::unordered_map<SourceStringId, std::string> string_map_;
+
+  // Mapping from ID of mapping / frame / callstack in original trace and the
+  // index in the respective table it was inserted into.
+  std::unordered_map<SourceMappingId, MappingId> mapping_ids_;
+  std::unordered_map<SourceFrameId, FrameId> frame_ids_;
+  std::unordered_map<SourceCallstackId, CallsiteId> callstack_ids_;
+
+  // TODO(oysteine): Share these indices between the StackProfileTrackers,
+  // since they're not sequence-specific.
+  //
+  // Mapping from content of database row to the index of the raw.
+  std::unordered_map<tables::StackProfileMappingTable::Row, MappingId>
+      mapping_idx_;
+  std::unordered_map<tables::StackProfileFrameTable::Row, FrameId> frame_idx_;
+  std::unordered_map<tables::StackProfileCallsiteTable::Row, CallsiteId>
+      callsite_idx_;
+
+  TraceProcessorContext* const context_;
+  StringId empty_;
+};
+
+}  // namespace trace_processor
+}  // namespace perfetto
+
+#endif  // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_TRACKER_H_
diff --git a/src/trace_processor/importers/proto/track_event_parser.cc b/src/trace_processor/importers/proto/track_event_parser.cc
index 00bf52e..06e5c39 100644
--- a/src/trace_processor/importers/proto/track_event_parser.cc
+++ b/src/trace_processor/importers/proto/track_event_parser.cc
@@ -34,7 +34,6 @@
 #include "src/trace_processor/importers/proto/packet_analyzer.h"
 #include "src/trace_processor/importers/proto/packet_sequence_state.h"
 #include "src/trace_processor/importers/proto/profile_packet_utils.h"
-#include "src/trace_processor/importers/proto/stack_profile_sequence_state.h"
 #include "src/trace_processor/importers/proto/track_event_tracker.h"
 #include "src/trace_processor/util/debug_annotation_parser.h"
 #include "src/trace_processor/util/proto_to_args_parser.h"
@@ -196,9 +195,12 @@
   }
   // Interned mapping_id loses it's meaning when the sequence ends. So we need
   // to get an id from stack_profile_mapping table.
-  auto mapping_id = delegate.seq_state()
-                        ->GetOrCreate<StackProfileSequenceState>()
-                        ->FindOrInsertMapping(decoder->mapping_id());
+  ProfilePacketInternLookup intern_lookup(delegate.seq_state());
+  auto mapping_id =
+      delegate.seq_state()
+          ->state()
+          ->sequence_stack_profile_tracker()
+          .FindOrInsertMapping(decoder->mapping_id(), &intern_lookup);
   if (!mapping_id) {
     return std::nullopt;
   }
diff --git a/src/trace_processor/importers/proto/v8_module.cc b/src/trace_processor/importers/proto/v8_module.cc
index 94684e3..ac2086a 100644
--- a/src/trace_processor/importers/proto/v8_module.cc
+++ b/src/trace_processor/importers/proto/v8_module.cc
@@ -88,7 +88,8 @@
 void V8Module::ParseV8JsCode(protozero::ConstBytes bytes,
                              int64_t ts,
                              const TracePacketData& data) {
-  V8SequenceState& state = *data.sequence_state->GetOrCreate<V8SequenceState>();
+  V8SequenceState& state =
+      *V8SequenceState::GetOrCreate(data.sequence_state->state());
 
   V8JsCode::Decoder code(bytes);
 
@@ -109,7 +110,8 @@
 void V8Module::ParseV8InternalCode(protozero::ConstBytes bytes,
                                    int64_t ts,
                                    const TracePacketData& data) {
-  V8SequenceState& state = *data.sequence_state->GetOrCreate<V8SequenceState>();
+  V8SequenceState& state =
+      *V8SequenceState::GetOrCreate(data.sequence_state->state());
 
   V8InternalCode::Decoder code(bytes);
 
@@ -124,7 +126,8 @@
 void V8Module::ParseV8WasmCode(protozero::ConstBytes bytes,
                                int64_t ts,
                                const TracePacketData& data) {
-  V8SequenceState& state = *data.sequence_state->GetOrCreate<V8SequenceState>();
+  V8SequenceState& state =
+      *V8SequenceState::GetOrCreate(data.sequence_state->state());
 
   V8WasmCode::Decoder code(bytes);
 
@@ -145,7 +148,8 @@
 void V8Module::ParseV8RegExpCode(protozero::ConstBytes bytes,
                                  int64_t ts,
                                  const TracePacketData& data) {
-  V8SequenceState& state = *data.sequence_state->GetOrCreate<V8SequenceState>();
+  V8SequenceState& state =
+      *V8SequenceState::GetOrCreate(data.sequence_state->state());
 
   V8RegExpCode::Decoder code(bytes);
 
@@ -160,7 +164,8 @@
 void V8Module::ParseV8CodeMove(protozero::ConstBytes bytes,
                                int64_t,
                                const TracePacketData& data) {
-  V8SequenceState& state = *data.sequence_state->GetOrCreate<V8SequenceState>();
+  V8SequenceState& state =
+      *V8SequenceState::GetOrCreate(data.sequence_state->state());
   protos::pbzero::V8CodeMove::Decoder v8_code_move(bytes);
 
   std::optional<tables::V8IsolateTable::Id> isolate_id =
diff --git a/src/trace_processor/importers/proto/v8_sequence_state.cc b/src/trace_processor/importers/proto/v8_sequence_state.cc
index 33abb24..946ab22 100644
--- a/src/trace_processor/importers/proto/v8_sequence_state.cc
+++ b/src/trace_processor/importers/proto/v8_sequence_state.cc
@@ -17,10 +17,10 @@
 #include "src/trace_processor/importers/proto/v8_sequence_state.h"
 #include <optional>
 
+#include "perfetto/ext/base/string_utils.h"
 #include "protos/perfetto/trace/chrome/v8.pbzero.h"
 #include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
 #include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
 #include "src/trace_processor/importers/proto/string_encoding_utils.h"
 #include "src/trace_processor/importers/proto/v8_tracker.h"
 #include "src/trace_processor/storage/stats.h"
@@ -41,8 +41,9 @@
 
 }  // namespace
 
-V8SequenceState::V8SequenceState(TraceProcessorContext* context)
-    : context_(context), v8_tracker_(V8Tracker::GetOrCreate(context_)) {}
+V8SequenceState::V8SequenceState(PacketSequenceState* sequence_state)
+    : sequence_state_(sequence_state),
+      v8_tracker_(V8Tracker::GetOrCreate(sequence_state->context())) {}
 
 V8SequenceState::~V8SequenceState() = default;
 
@@ -52,9 +53,11 @@
     return *id;
   }
 
-  auto* view = GetInternedMessageView(InternedData::kV8IsolateFieldNumber, iid);
+  auto* view = sequence_state_->current_generation()->GetInternedMessageView(
+      InternedData::kV8IsolateFieldNumber, iid);
   if (!view) {
-    context_->storage->IncrementStats(stats::v8_intern_errors);
+    sequence_state_->context()->storage->IncrementStats(
+        stats::v8_intern_errors);
     return std::nullopt;
   }
 
@@ -70,10 +73,11 @@
     return *id;
   }
 
-  auto* view =
-      GetInternedMessageView(InternedData::kV8JsFunctionFieldNumber, iid);
+  auto* view = sequence_state_->current_generation()->GetInternedMessageView(
+      InternedData::kV8JsFunctionFieldNumber, iid);
   if (!view) {
-    context_->storage->IncrementStats(stats::v8_intern_errors);
+    sequence_state_->context()->storage->IncrementStats(
+        stats::v8_intern_errors);
     return std::nullopt;
   }
 
@@ -103,10 +107,11 @@
   if (auto* id = wasm_scripts_.Find(iid); id != nullptr) {
     return *id;
   }
-  auto* view =
-      GetInternedMessageView(InternedData::kV8WasmScriptFieldNumber, iid);
+  auto* view = sequence_state_->current_generation()->GetInternedMessageView(
+      InternedData::kV8WasmScriptFieldNumber, iid);
   if (!view) {
-    context_->storage->IncrementStats(stats::v8_intern_errors);
+    sequence_state_->context()->storage->IncrementStats(
+        stats::v8_intern_errors);
     return std::nullopt;
   }
 
@@ -122,10 +127,11 @@
   if (auto* id = js_scripts_.Find(iid); id != nullptr) {
     return *id;
   }
-  auto* view =
-      GetInternedMessageView(InternedData::kV8JsScriptFieldNumber, iid);
+  auto* view = sequence_state_->current_generation()->GetInternedMessageView(
+      InternedData::kV8JsScriptFieldNumber, iid);
   if (!view) {
-    context_->storage->IncrementStats(stats::v8_intern_errors);
+    sequence_state_->context()->storage->IncrementStats(
+        stats::v8_intern_errors);
     return std::nullopt;
   }
 
@@ -141,16 +147,17 @@
     return *id;
   }
 
-  auto* view =
-      GetInternedMessageView(InternedData::kV8JsFunctionNameFieldNumber, iid);
+  auto* view = sequence_state_->current_generation()->GetInternedMessageView(
+      InternedData::kV8JsFunctionNameFieldNumber, iid);
 
   if (!view) {
-    context_->storage->IncrementStats(stats::v8_intern_errors);
+    sequence_state_->context()->storage->IncrementStats(
+        stats::v8_intern_errors);
     return std::nullopt;
   }
 
   InternedV8String::Decoder function_name(ToConstBytes(view->message()));
-  auto& storage = *context_->storage;
+  auto& storage = *sequence_state_->context()->storage;
   StringId id;
   if (function_name.has_latin1()) {
     id = storage.InternString(
diff --git a/src/trace_processor/importers/proto/v8_sequence_state.h b/src/trace_processor/importers/proto/v8_sequence_state.h
index d2e008a..781960d 100644
--- a/src/trace_processor/importers/proto/v8_sequence_state.h
+++ b/src/trace_processor/importers/proto/v8_sequence_state.h
@@ -21,7 +21,7 @@
 #include <optional>
 
 #include "perfetto/ext/base/flat_hash_map.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
+#include "src/trace_processor/importers/proto/packet_sequence_state.h"
 #include "src/trace_processor/storage/trace_storage.h"
 #include "src/trace_processor/tables/v8_tables_py.h"
 #include "src/trace_processor/types/destructible.h"
@@ -29,14 +29,19 @@
 namespace perfetto {
 namespace trace_processor {
 
-class TraceProcessorContext;
 class V8Tracker;
 
 // Helper class to deal with V8 related interned data.
-class V8SequenceState final
-    : public PacketSequenceStateGeneration::InternedDataTracker {
+class V8SequenceState : public Destructible {
  public:
-  explicit V8SequenceState(TraceProcessorContext* context);
+  static V8SequenceState* GetOrCreate(PacketSequenceState* sequence_state) {
+    auto& v8_sequence_state =
+        sequence_state->extensible_sequence_state().v8_sequence_state;
+    if (!v8_sequence_state) {
+      v8_sequence_state.reset(new V8SequenceState(sequence_state));
+    }
+    return static_cast<V8SequenceState*>(v8_sequence_state.get());
+  }
 
   ~V8SequenceState() override;
 
@@ -49,12 +54,13 @@
       tables::V8IsolateTable::Id isolate_id);
 
  private:
+  explicit V8SequenceState(PacketSequenceState* sequence_state);
   std::optional<tables::V8JsScriptTable::Id> GetOrInsertJsScript(
       uint64_t iid,
       tables::V8IsolateTable::Id isolate_id);
   std::optional<StringId> GetOrInsertJsFunctionName(uint64_t iid);
 
-  TraceProcessorContext* const context_;
+  PacketSequenceState* const sequence_state_;
   V8Tracker* const v8_tracker_;
 
   using InterningId = uint64_t;
diff --git a/src/trace_processor/importers/proto/vulkan_memory_tracker.h b/src/trace_processor/importers/proto/vulkan_memory_tracker.h
index 9d1afc5..1457923 100644
--- a/src/trace_processor/importers/proto/vulkan_memory_tracker.h
+++ b/src/trace_processor/importers/proto/vulkan_memory_tracker.h
@@ -17,7 +17,6 @@
 #ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_VULKAN_MEMORY_TRACKER_H_
 #define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_VULKAN_MEMORY_TRACKER_H_
 
-#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
 #include "src/trace_processor/importers/proto/proto_incremental_state.h"
 #include "src/trace_processor/storage/trace_storage.h"
 
diff --git a/src/trace_processor/importers/proto/winscope/protolog_parser.h b/src/trace_processor/importers/proto/winscope/protolog_parser.h
index 97d9183..fbcf9d9 100644
--- a/src/trace_processor/importers/proto/winscope/protolog_parser.h
+++ b/src/trace_processor/importers/proto/winscope/protolog_parser.h
@@ -19,7 +19,6 @@
 
 #include "protos/perfetto/trace/android/protolog.pbzero.h"
 #include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/storage/trace_storage.h"
 #include "src/trace_processor/util/descriptors.h"
 #include "src/trace_processor/util/proto_to_args_parser.h"
 
diff --git a/src/trace_processor/importers/syscalls/syscall_tracker_unittest.cc b/src/trace_processor/importers/syscalls/syscall_tracker_unittest.cc
index d57d6de..f424a75 100644
--- a/src/trace_processor/importers/syscalls/syscall_tracker_unittest.cc
+++ b/src/trace_processor/importers/syscalls/syscall_tracker_unittest.cc
@@ -83,7 +83,7 @@
   EXPECT_EQ(context.storage->GetString(end_name), "sys_57");
 }
 
-TEST_F(SyscallTrackerTest, Aarch64) {
+TEST_F(SyscallTrackerTest, Arm64) {
   constexpr TrackId track{0u};
   StringId begin_name = kNullStringId;
   StringId end_name = kNullStringId;
@@ -93,7 +93,7 @@
       .WillOnce(DoAll(SaveArg<3>(&end_name), Return(std::nullopt)));
 
   SyscallTracker* syscall_tracker = SyscallTracker::GetOrCreate(&context);
-  syscall_tracker->SetArchitecture(Architecture::kAarch64);
+  syscall_tracker->SetArchitecture(Architecture::kArm64);
   syscall_tracker->Enter(100 /*ts*/, 42 /*utid*/, 63 /*sys_read*/);
   syscall_tracker->Exit(110 /*ts*/, 42 /*utid*/, 63 /*sys_read*/);
   EXPECT_EQ(context.storage->GetString(begin_name), "sys_read");
@@ -122,7 +122,7 @@
   EXPECT_CALL(*slice_tracker, End(_, _, _, _, _)).Times(0);
 
   SyscallTracker* syscall_tracker = SyscallTracker::GetOrCreate(&context);
-  syscall_tracker->SetArchitecture(Architecture::kAarch64);
+  syscall_tracker->SetArchitecture(Architecture::kArm64);
   syscall_tracker->Enter(100 /*ts*/, 42 /*utid*/, 9999);
   syscall_tracker->Exit(110 /*ts*/, 42 /*utid*/, 9999);
 }
diff --git a/src/trace_processor/metrics/sql/android/android_batt.sql b/src/trace_processor/metrics/sql/android/android_batt.sql
index 4ec27b3..a6cc552 100644
--- a/src/trace_processor/metrics/sql/android/android_batt.sql
+++ b/src/trace_processor/metrics/sql/android/android_batt.sql
@@ -60,7 +60,7 @@
 DROP TABLE IF EXISTS screen_state_span;
 CREATE PERFETTO TABLE screen_state_span AS
 WITH screen_state AS (
-  SELECT *
+  SELECT counter.id, ts, 0 AS track_id, value
   FROM counter
   JOIN counter_track ON counter_track.id = counter.track_id
   WHERE name = 'ScreenState'
diff --git a/src/trace_processor/metrics/sql/android/android_binder.sql b/src/trace_processor/metrics/sql/android/android_binder.sql
index a1b8661..1c41e60 100644
--- a/src/trace_processor/metrics/sql/android/android_binder.sql
+++ b/src/trace_processor/metrics/sql/android/android_binder.sql
@@ -57,6 +57,8 @@
         'server_pid', server_pid,
         'server_oom_score', server_oom_score,
         'is_sync', is_sync,
+        'client_monotonic_dur', client_monotonic_dur,
+        'server_monotonic_dur', server_monotonic_dur,
         'client_package_version_code', client_package_version_code,
         'server_package_version_code', server_package_version_code,
         'is_client_package_debuggable', is_client_package_debuggable,
diff --git a/src/trace_processor/metrics/sql/android/android_cpu_agg.sql b/src/trace_processor/metrics/sql/android/android_cpu_agg.sql
index 71d3847..619d560 100644
--- a/src/trace_processor/metrics/sql/android/android_cpu_agg.sql
+++ b/src/trace_processor/metrics/sql/android/android_cpu_agg.sql
@@ -21,7 +21,7 @@
 SELECT
   cpu,
   ts,
-  LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
+  LEAD(ts, 1, trace_end())
   OVER (PARTITION BY cpu ORDER BY ts) - ts AS dur,
   CAST(value AS INT) AS freq_khz
 FROM counter
diff --git a/src/trace_processor/metrics/sql/android/android_dma_heap.sql b/src/trace_processor/metrics/sql/android/android_dma_heap.sql
index ae80ac5..03813f7 100644
--- a/src/trace_processor/metrics/sql/android/android_dma_heap.sql
+++ b/src/trace_processor/metrics/sql/android/android_dma_heap.sql
@@ -18,7 +18,7 @@
 CREATE PERFETTO VIEW dma_heap_timeline AS
 SELECT
   ts,
-  LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
+  LEAD(ts, 1, trace_end())
   OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
   track_id,
   value
diff --git a/src/trace_processor/metrics/sql/android/android_dvfs.sql b/src/trace_processor/metrics/sql/android/android_dvfs.sql
index 6ec1bb2..6366256 100644
--- a/src/trace_processor/metrics/sql/android/android_dvfs.sql
+++ b/src/trace_processor/metrics/sql/android/android_dvfs.sql
@@ -21,8 +21,7 @@
   track.name AS freq_name,
   ts,
   value AS freq_value,
-  LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
-  OVER (PARTITION BY track.id ORDER BY ts) - ts AS duration
+  LEAD(ts, 1, trace_end()) OVER (PARTITION BY track.id ORDER BY ts) - ts AS duration
 FROM counter
 LEFT JOIN track ON counter.track_id = track.id
 WHERE track.name GLOB "* Frequency"
diff --git a/src/trace_processor/metrics/sql/android/android_fastrpc.sql b/src/trace_processor/metrics/sql/android/android_fastrpc.sql
index d895b42..6d174de 100644
--- a/src/trace_processor/metrics/sql/android/android_fastrpc.sql
+++ b/src/trace_processor/metrics/sql/android/android_fastrpc.sql
@@ -2,7 +2,7 @@
 CREATE PERFETTO VIEW fastrpc_timeline AS
 SELECT
   ts,
-  LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
+  LEAD(ts, 1, trace_end())
   OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
   RTRIM(SUBSTR(name, 13), ']') AS subsystem_name,
   track_id,
diff --git a/src/trace_processor/metrics/sql/android/android_ion.sql b/src/trace_processor/metrics/sql/android/android_ion.sql
index a6bdf07..1071eef 100644
--- a/src/trace_processor/metrics/sql/android/android_ion.sql
+++ b/src/trace_processor/metrics/sql/android/android_ion.sql
@@ -18,7 +18,7 @@
 CREATE PERFETTO VIEW ion_timeline AS
 SELECT
   ts,
-  LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
+  LEAD(ts, 1, trace_end())
   OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
   CASE name
     WHEN 'mem.ion' THEN 'all'
diff --git a/src/trace_processor/metrics/sql/android/android_monitor_contention.sql b/src/trace_processor/metrics/sql/android/android_monitor_contention.sql
index 9008520..5c78590 100644
--- a/src/trace_processor/metrics/sql/android/android_monitor_contention.sql
+++ b/src/trace_processor/metrics/sql/android/android_monitor_contention.sql
@@ -27,6 +27,7 @@
         'node_id', id,
         'ts', ts,
         'dur', dur,
+        'monotonic_dur', monotonic_dur,
         'blocking_method', blocking_method,
         'blocked_method', blocked_method,
         'short_blocking_method', short_blocking_method,
diff --git a/src/trace_processor/metrics/sql/android/android_netperf.sql b/src/trace_processor/metrics/sql/android/android_netperf.sql
index f7192b9..2676eb0 100644
--- a/src/trace_processor/metrics/sql/android/android_netperf.sql
+++ b/src/trace_processor/metrics/sql/android/android_netperf.sql
@@ -236,7 +236,7 @@
 SELECT
   cpu,
   ts,
-  LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
+  LEAD(ts, 1, trace_end())
   OVER (PARTITION BY cpu ORDER BY ts) - ts AS dur,
   CAST(value AS INT) AS freq_khz
 FROM counter
diff --git a/src/trace_processor/metrics/sql/android/android_startup.sql b/src/trace_processor/metrics/sql/android/android_startup.sql
index 10fa253..18f9fbf 100644
--- a/src/trace_processor/metrics/sql/android/android_startup.sql
+++ b/src/trace_processor/metrics/sql/android/android_startup.sql
@@ -23,7 +23,7 @@
 -- Define the helper functions which will be used throught the remainder
 -- of the metric.
 SELECT RUN_METRIC('android/startup/slice_functions.sql');
-INCLUDE PERFETTO MODULE common.timestamps;
+INCLUDE PERFETTO MODULE intervals.overlap;
 
 -- Define helper functions related to slow start reasons
 SELECT RUN_METRIC('android/startup/slow_start_reasons.sql');
@@ -45,6 +45,15 @@
 -- Define helper functions for system state.
 SELECT RUN_METRIC('android/startup/system_state.sql');
 
+CREATE OR REPLACE PERFETTO FUNCTION _is_spans_overlapping(
+  ts1 LONG,
+  ts_end1 LONG,
+  ts2 LONG,
+  ts_end2 LONG)
+RETURNS BOOL AS
+SELECT (IIF($ts1 < $ts2, $ts2, $ts1)
+      < IIF($ts_end1 < $ts_end2, $ts_end1, $ts_end2));
+
 -- Returns the slices for forked processes. Never present in hot starts.
 -- Prefer this over process start_ts, since the process might have
 -- been preforked.
@@ -318,7 +327,7 @@
       SELECT RepeatedField(package)
       FROM android_startups l
       WHERE l.startup_id != launches.startup_id
-        AND is_spans_overlapping(l.ts, l.ts_end, launches.ts, launches.ts_end)
+        AND _is_spans_overlapping(l.ts, l.ts_end, launches.ts, launches.ts_end)
     ),
     'dlopen_file', (
       SELECT RepeatedField(STR_SPLIT(slice_name, "dlopen: ", 1))
@@ -479,7 +488,7 @@
           SELECT package
           FROM android_startups l
           WHERE l.startup_id != launches.startup_id
-            AND is_spans_overlapping(l.ts, l.ts_end, launches.ts, launches.ts_end)
+            AND _is_spans_overlapping(l.ts, l.ts_end, launches.ts, launches.ts_end)
         )
 
         UNION ALL
diff --git a/src/trace_processor/metrics/sql/android/counter_span_view_merged.sql b/src/trace_processor/metrics/sql/android/counter_span_view_merged.sql
index 4caaf88..eff2fbb 100644
--- a/src/trace_processor/metrics/sql/android/counter_span_view_merged.sql
+++ b/src/trace_processor/metrics/sql/android/counter_span_view_merged.sql
@@ -28,8 +28,7 @@
 CREATE PERFETTO VIEW {{table_name}}_span AS
 SELECT
   ts,
-  LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
-  OVER(ORDER BY ts) - ts AS dur,
+  LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur,
   CAST(value AS INT) AS {{table_name}}_val
 FROM (
     SELECT ts, value, LAG(value) OVER (ORDER BY ts) AS lag_value
diff --git a/src/trace_processor/metrics/sql/android/global_counter_span_view.sql b/src/trace_processor/metrics/sql/android/global_counter_span_view.sql
index 4db10d3..61c7b99 100644
--- a/src/trace_processor/metrics/sql/android/global_counter_span_view.sql
+++ b/src/trace_processor/metrics/sql/android/global_counter_span_view.sql
@@ -18,8 +18,7 @@
 CREATE PERFETTO VIEW {{table_name}}_span AS
 SELECT
   ts,
-  LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
-  OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
+  LEAD(ts, 1, trace_end()) OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
   value AS {{table_name}}_val
 FROM counter c JOIN counter_track t
   ON t.id = c.track_id
diff --git a/src/trace_processor/metrics/sql/android/gpu_counter_span_view.sql b/src/trace_processor/metrics/sql/android/gpu_counter_span_view.sql
index 9c902a3..7017e9e 100644
--- a/src/trace_processor/metrics/sql/android/gpu_counter_span_view.sql
+++ b/src/trace_processor/metrics/sql/android/gpu_counter_span_view.sql
@@ -18,8 +18,7 @@
 CREATE PERFETTO VIEW {{table_name}}_span AS
 SELECT
   ts,
-  LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
-  OVER (PARTITION BY track_id ORDER BY ts) - ts AS dur,
+  LEAD(ts, 1, trace_end()) OVER (PARTITION BY track_id ORDER BY ts) - ts AS dur,
   gpu_id,
   value AS {{table_name}}_val
 FROM counter c JOIN gpu_counter_track t
diff --git a/src/trace_processor/metrics/sql/android/process_counter_span_view.sql b/src/trace_processor/metrics/sql/android/process_counter_span_view.sql
index 0ab4088..89919c9 100644
--- a/src/trace_processor/metrics/sql/android/process_counter_span_view.sql
+++ b/src/trace_processor/metrics/sql/android/process_counter_span_view.sql
@@ -21,7 +21,7 @@
   LEAD(ts, 1, (
     SELECT IFNULL(
       end_ts,
-      (SELECT end_ts FROM trace_bounds)
+      trace_end()
     )
     FROM process p WHERE p.upid = pct.upid) + 1
   ) OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
diff --git a/src/trace_processor/metrics/sql/android/process_oom_score.sql b/src/trace_processor/metrics/sql/android/process_oom_score.sql
index 84a1657..df72398 100644
--- a/src/trace_processor/metrics/sql/android/process_oom_score.sql
+++ b/src/trace_processor/metrics/sql/android/process_oom_score.sql
@@ -19,7 +19,7 @@
 CREATE PERFETTO VIEW oom_score_span AS
 SELECT
   ts,
-  LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
+  LEAD(ts, 1, trace_end() + 1)
   OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
   upid,
   CAST(value AS INT) AS oom_score_val
diff --git a/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql b/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql
index eae7d59..00faead 100644
--- a/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql
+++ b/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql
@@ -32,7 +32,7 @@
   ROW_NUMBER()
   OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS id,
   ts,
-  LEAD(ts, 1, (SELECT end_ts FROM trace_bounds)) OVER(ORDER BY ts) - ts AS dur
+  LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur
 FROM activity_intent_received
 ORDER BY ts;
 
diff --git a/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql b/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql
index 4d361f4..2a673c0 100644
--- a/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql
+++ b/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql
@@ -20,6 +20,15 @@
 SELECT RUN_METRIC('android/startup/system_state.sql');
 SELECT RUN_METRIC('android/startup/mcycles_per_launch.sql');
 
+CREATE OR REPLACE PERFETTO FUNCTION _is_spans_overlapping(
+  ts1 LONG,
+  ts_end1 LONG,
+  ts2 LONG,
+  ts_end2 LONG)
+RETURNS BOOL AS
+SELECT (IIF($ts1 < $ts2, $ts2, $ts1)
+      < IIF($ts_end1 < $ts_end2, $ts_end1, $ts_end2));
+
 CREATE OR REPLACE PERFETTO FUNCTION get_percent(num LONG, total LONG)
 RETURNS STRING AS
   SELECT SUBSTRING(CAST(($num * 100 + 0.0) / $total AS STRING), 1, 5);
@@ -376,7 +385,7 @@
           SELECT package
           FROM android_startups l
           WHERE l.startup_id != launch.startup_id
-            AND is_spans_overlapping(l.ts, l.ts_end, launch.ts, launch.ts_end)
+            AND _is_spans_overlapping(l.ts, l.ts_end, launch.ts, launch.ts_end)
         )
 
         UNION ALL
diff --git a/src/trace_processor/metrics/sql/android/startup/thread_state_breakdown.sql b/src/trace_processor/metrics/sql/android/startup/thread_state_breakdown.sql
index 7bd3dee..92103f1 100644
--- a/src/trace_processor/metrics/sql/android/startup/thread_state_breakdown.sql
+++ b/src/trace_processor/metrics/sql/android/startup/thread_state_breakdown.sql
@@ -20,7 +20,7 @@
 CREATE PERFETTO VIEW thread_state_extended AS
 SELECT
   ts,
-  IIF(dur = -1, (SELECT end_ts FROM trace_bounds), dur) AS dur,
+  IIF(dur = -1, trace_end(), dur) AS dur,
   utid,
   state,
   io_wait
diff --git a/src/trace_processor/metrics/sql/android/thread_counter_span_view.sql b/src/trace_processor/metrics/sql/android/thread_counter_span_view.sql
index 21961a9..6e7bba7 100644
--- a/src/trace_processor/metrics/sql/android/thread_counter_span_view.sql
+++ b/src/trace_processor/metrics/sql/android/thread_counter_span_view.sql
@@ -21,7 +21,7 @@
   LEAD(ts, 1, (
     SELECT IFNULL(
       end_ts,
-      (SELECT end_ts FROM trace_bounds)
+      trace_end()
     )
     FROM thread th WHERE th.utid = t.utid) + 1
   ) OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
diff --git a/src/trace_processor/metrics/sql/chrome/rail_modes.sql b/src/trace_processor/metrics/sql/chrome/rail_modes.sql
index 38c095b..c0da0fb 100644
--- a/src/trace_processor/metrics/sql/chrome/rail_modes.sql
+++ b/src/trace_processor/metrics/sql/chrome/rail_modes.sql
@@ -97,8 +97,7 @@
 -- metrics that use the trace.
 DROP VIEW IF EXISTS trace_has_realistic_length;
 CREATE PERFETTO VIEW trace_has_realistic_length AS
-SELECT (end_ts - start_ts) < 1e9 * 60 * 10 AS value
-FROM trace_bounds;
+SELECT trace_dur() < 1e9 * 60 * 10 AS value;
 
 -- RAIL_MODE_LOAD seems to get stuck which makes it not very useful so remap it
 -- to RAIL_MODE_ANIMATION so it doesn't dominate the overall RAIL mode.
@@ -214,11 +213,12 @@
   dur,
   1
 FROM (SELECT start_ts AS ts,
-  COALESCE((
+  COALESCE(
+    (
     SELECT MIN(ts)
     FROM slice
     WHERE name = "VSync"
-  ) - start_ts - const.vsync_padding,
+) - start_ts - const.vsync_padding,
   end_ts - start_ts
   ) AS dur
   FROM trace_bounds, const)
diff --git a/src/trace_processor/metrics/sql/common/parent_slice.sql b/src/trace_processor/metrics/sql/common/parent_slice.sql
index 1f24720..d5c6f24 100644
--- a/src/trace_processor/metrics/sql/common/parent_slice.sql
+++ b/src/trace_processor/metrics/sql/common/parent_slice.sql
@@ -14,4 +14,4 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
diff --git a/src/trace_processor/metrics/sql/trace_metadata.sql b/src/trace_processor/metrics/sql/trace_metadata.sql
index cee4e2d..b963ff2 100644
--- a/src/trace_processor/metrics/sql/trace_metadata.sql
+++ b/src/trace_processor/metrics/sql/trace_metadata.sql
@@ -29,7 +29,7 @@
 DROP VIEW IF EXISTS trace_metadata_output;
 CREATE PERFETTO VIEW trace_metadata_output AS
 SELECT TraceMetadata(
-  'trace_duration_ns', CAST((SELECT end_ts - start_ts FROM trace_bounds) AS INT),
+  'trace_duration_ns', CAST(trace_dur() AS INT),
   'trace_uuid', (SELECT str_value FROM metadata WHERE name = 'trace_uuid'),
   'android_build_fingerprint', (
     SELECT str_value FROM metadata WHERE name = 'android_build_fingerprint'
diff --git a/src/trace_processor/perfetto_sql/engine/perfetto_sql_engine.cc b/src/trace_processor/perfetto_sql/engine/perfetto_sql_engine.cc
index 60122a0..e29933b 100644
--- a/src/trace_processor/perfetto_sql/engine/perfetto_sql_engine.cc
+++ b/src/trace_processor/perfetto_sql/engine/perfetto_sql_engine.cc
@@ -409,6 +409,11 @@
 
 base::Status PerfettoSqlEngine::ExecuteCreateTable(
     const PerfettoSqlParser::CreateTable& create_table) {
+  PERFETTO_TP_TRACE(metatrace::Category::QUERY_TIMELINE,
+                    "CREATE_PERFETTO_TABLE",
+                    [&create_table](metatrace::Record* record) {
+                      record->AddArg("Table", create_table.name);
+                    });
   auto stmt_or = engine_->PrepareStatement(create_table.sql);
   RETURN_IF_ERROR(stmt_or.status());
   SqliteEngine::PreparedStatement stmt = std::move(stmt_or);
diff --git a/src/trace_processor/perfetto_sql/engine/perfetto_sql_parser.cc b/src/trace_processor/perfetto_sql/engine/perfetto_sql_parser.cc
index a864b6d..a246c6a 100644
--- a/src/trace_processor/perfetto_sql/engine/perfetto_sql_parser.cc
+++ b/src/trace_processor/perfetto_sql/engine/perfetto_sql_parser.cc
@@ -230,7 +230,7 @@
 
   if (!ValidateModuleName(key)) {
     base::StackString<1024> err(
-        "Include key should be a dot-separated list of module names, with the"
+        "Include key should be a dot-separated list of module names, with the "
         "last name optionally being a wildcard: '%s'",
         key.c_str());
     return ErrorAtToken(tok, err.c_str());
diff --git a/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_flamegraph.cc b/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_flamegraph.cc
index b4d76cf..fde9046 100644
--- a/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_flamegraph.cc
+++ b/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_flamegraph.cc
@@ -31,8 +31,8 @@
 #include "src/trace_processor/db/column/types.h"
 #include "src/trace_processor/db/table.h"
 #include "src/trace_processor/importers/proto/heap_graph_tracker.h"
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
 #include "src/trace_processor/perfetto_sql/intrinsics/table_functions/flamegraph_construction_algorithms.h"
-#include "src/trace_processor/sqlite/sqlite_utils.h"
 #include "src/trace_processor/storage/trace_storage.h"
 #include "src/trace_processor/tables/profiler_tables_py.h"
 #include "src/trace_processor/types/trace_processor_context.h"
diff --git a/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_slice_layout.cc b/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_slice_layout.cc
index 32237bf..51adc4a 100644
--- a/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_slice_layout.cc
+++ b/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_slice_layout.cc
@@ -233,10 +233,24 @@
       }
     }
 
+    uint32_t layout_depth = 0;
+
+    // In a pathological case you can end up stacking up slices forever
+    // triggering n^2 behaviour below. In those cases we want to give
+    // up on trying to find a pretty (height minimizing ) layout and
+    // just find *some* layout. To do that we start looking for
+    // a layout depth below the maximum open group which should
+    // immediately succeed.
+    if (still_open.size() > 500) {
+      for (const auto& open : still_open) {
+        layout_depth =
+            std::max(layout_depth, open->layout_depth + open->max_depth);
+      }
+    }
+
     // Find a start layout depth for this group s.t. our start depth +
     // our max depth will not intersect with the start depth + max depth for
     // any of the open groups:
-    uint32_t layout_depth = 0;
     bool done = false;
     while (!done) {
       done = true;
diff --git a/src/trace_processor/perfetto_sql/prelude/tables.sql b/src/trace_processor/perfetto_sql/prelude/tables.sql
index 9ba3b11..bc01757 100644
--- a/src/trace_processor/perfetto_sql/prelude/tables.sql
+++ b/src/trace_processor/perfetto_sql/prelude/tables.sql
@@ -1,6 +1,3 @@
-CREATE TABLE trace_bounds AS
-SELECT 0 AS start_ts, 0 AS end_ts;
-
 CREATE TABLE power_profile(
   device STRING,
   cpu INT,
diff --git a/src/trace_processor/perfetto_sql/stdlib/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/BUILD.gn
index eab54f3..fa871e6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/BUILD.gn
@@ -23,6 +23,7 @@
     "chrome:chrome_sql",
     "common",
     "counters",
+    "deprecated/v42/common",
     "graphs",
     "intervals",
     "linux",
@@ -30,6 +31,7 @@
     "prelude",
     "sched",
     "slices",
+    "time",
   ]
   generated_header = "stdlib.h"
   namespace = "stdlib"
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
index be50773..29c4b89 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
@@ -31,6 +31,7 @@
     "job_scheduler.sql",
     "monitor_contention.sql",
     "network_packets.sql",
+    "oom_adjuster.sql",
     "process_metadata.sql",
     "screenshots.sql",
     "services.sql",
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql b/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
index 45c6e93..2e68b5f 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
@@ -13,7 +13,7 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 --
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 
 -- All process starts.
 CREATE PERFETTO VIEW _proc_start
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql b/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql
index 828400e..ff69029 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql
@@ -13,8 +13,6 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
-INCLUDE PERFETTO MODULE common.timestamps;
-
 -- Converts a battery_stats counter value to human readable string.
 CREATE PERFETTO FUNCTION android_battery_stats_counter_to_string(
   -- The counter track name (e.g. 'battery_stats.audio').
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/binder.sql b/src/trace_processor/perfetto_sql/stdlib/android/binder.sql
index 7ee6dfb..e168970 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/binder.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/binder.sql
@@ -14,8 +14,8 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.timestamps;
 INCLUDE PERFETTO MODULE android.process_metadata;
+INCLUDE PERFETTO MODULE android.suspend;
 
 -- Count Binder transactions per process.
 CREATE PERFETTO VIEW android_binder_metrics_by_process(
@@ -163,8 +163,8 @@
     process.upid,
     CAST(c.value AS INT) AS value,
     c.ts,
-    IFNULL(LEAD(ts) OVER (PARTITION BY upid ORDER BY ts), trace_bounds.end_ts) AS end_ts
-    FROM counter c, trace_bounds
+    IFNULL(LEAD(ts) OVER (PARTITION BY upid ORDER BY ts), trace_end()) AS end_ts
+    FROM counter c
          JOIN process_counter_track t ON c.track_id = t.id
          JOIN process USING (upid)
    WHERE t.name = 'oom_score_adj';
@@ -423,7 +423,7 @@
   is_main_thread BOOL,
   -- timestamp of the client txn.
   client_ts INT,
-  -- dur of the client txn.
+  -- wall clock dur of the client txn.
   client_dur INT,
   -- slice id of the binder reply.
   binder_reply_id INT,
@@ -441,7 +441,7 @@
   server_pid INT,
   -- timestamp of the server txn.
   server_ts INT,
-  -- dur of the server txn.
+  -- wall clock dur of the server txn.
   server_dur INT,
   -- oom score of the client process at the start of the txn.
   client_oom_score INT,
@@ -449,6 +449,10 @@
   server_oom_score INT,
   -- whether the txn is synchronous or async (oneway).
   is_sync BOOL,
+  -- monotonic clock dur of the client txn.
+  client_monotonic_dur INT,
+  -- monotonic clock dur of the server txn.
+  server_monotonic_dur INT,
   -- Client package version_code.
   client_package_version_code INT,
   -- Server package version_code.
@@ -463,6 +467,8 @@
 SELECT *, 0 AS is_sync FROM _async_binder_metrics_by_txn
 ) SELECT
   all_binder.*,
+  _extract_duration_without_suspend(client_ts, client_dur) AS client_monotonic_dur,
+  _extract_duration_without_suspend(server_ts, server_dur) AS server_monotonic_dur,
   client_process_metadata.version_code AS client_package_version_code,
   server_process_metadata.version_code AS server_package_version_code,
   client_process_metadata.debuggable AS is_client_package_debuggable,
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/dvfs.sql b/src/trace_processor/perfetto_sql/stdlib/android/dvfs.sql
index 22fe345..d6a43d6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/dvfs.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/dvfs.sql
@@ -28,8 +28,7 @@
   counter_track.name,
   counter.ts,
   counter.value,
-  LEAD(counter.ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
-  OVER (PARTITION BY counter_track.id ORDER BY counter.ts) - counter.ts AS dur
+  LEAD(counter.ts, 1, trace_end()) OVER (PARTITION BY counter_track.id ORDER BY counter.ts) - counter.ts AS dur
 FROM counter
 JOIN counter_track
   ON counter.track_id = counter_track.id
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql b/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
index 264fa78..9ccdca9 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
@@ -14,8 +14,6 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.timestamps;
-
 CREATE PERFETTO FUNCTION _extract_freezer_pid(name STRING)
 RETURNS INT
 AS
@@ -50,6 +48,45 @@
 ORDER BY upid DESC
 LIMIT 1;
 
+-- Translate unfreeze reason from INT to STRING.
+-- See: frameworks/proto_logging/stats/atoms.proto
+CREATE PERFETTO FUNCTION _translate_unfreeze_reason(reason INT)
+RETURNS STRING
+AS
+SELECT
+  CASE
+    WHEN $reason = 0 THEN 'none'
+    WHEN $reason = 1 THEN 'activity'
+    WHEN $reason = 2 THEN 'finish_receiver'
+    WHEN $reason = 3 THEN 'start_receiver'
+    WHEN $reason = 4 THEN 'bind_service'
+    WHEN $reason = 5 THEN 'unbind_service'
+    WHEN $reason = 6 THEN 'start_service'
+    WHEN $reason = 7 THEN 'get_provider'
+    WHEN $reason = 8 THEN 'remove_provider'
+    WHEN $reason = 9 THEN 'ui_visibility'
+    WHEN $reason = 10 THEN 'allowlist'
+    WHEN $reason = 11 THEN 'process_begin'
+    WHEN $reason = 12 THEN 'process_end'
+    WHEN $reason = 13 THEN 'trim_memory'
+    WHEN $reason = 15 THEN 'ping'
+    WHEN $reason = 16 THEN 'file_locks'
+    WHEN $reason = 17 THEN 'file_lock_check_failure'
+    WHEN $reason = 18 THEN 'binder_txns'
+    WHEN $reason = 19 THEN 'feature_flags'
+    WHEN $reason = 20 THEN 'short_fgs_timeout'
+    WHEN $reason = 21 THEN 'system_init'
+    WHEN $reason = 22 THEN 'backup'
+    WHEN $reason = 23 THEN 'shell'
+    WHEN $reason = 24 THEN 'remove_task'
+    WHEN $reason = 25 THEN 'uid_idle'
+    WHEN $reason = 26 THEN 'stop_service'
+    WHEN $reason = 27 THEN 'executing_service'
+    WHEN $reason = 28 THEN 'restriction_change'
+    WHEN $reason = 29 THEN 'component_disabled'
+    ELSE NULL
+  END;
+
 -- All frozen processes and their frozen duration.
 CREATE PERFETTO TABLE android_freezer_events (
   -- Upid of frozen process
@@ -59,19 +96,25 @@
   -- Timestamp process was frozen.
   ts INT,
   -- Duration process was frozen for.
-  dur INT
+  dur INT,
+  -- Unfreeze reason Integer.
+  unfreeze_reason_int INT,
+  -- Unfreeze reason String.
+  unfreeze_reason_str INT
   )
 AS
 WITH
   freeze AS (
     SELECT ts, _extract_freezer_pid(name) AS pid,
-    _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'freeze' AS type
+    _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'freeze' AS type,
+    NULL AS unfreeze_reason
     FROM slice
     WHERE name GLOB 'Freeze *:*'
   ),
   unfreeze AS (
     SELECT ts, _extract_freezer_pid(name) AS pid,
-    _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'unfreeze' AS type
+    _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'unfreeze' AS type,
+    str_split(name, ' ', 2) AS unfreeze_reason
     FROM slice
     WHERE name GLOB 'Unfreeze *:*'
   ),
@@ -86,9 +129,16 @@
       upid,
       pid,
       ts,
-      ifnull(lead(ts) OVER (PARTITION BY upid ORDER BY ts), trace_end()) - ts AS dur
+      ifnull(lead(ts) OVER (PARTITION BY upid ORDER BY ts), trace_end()) - ts AS dur,
+      CAST(lead(unfreeze_reason) OVER (PARTITION BY upid ORDER BY ts) AS INT) AS unfreeze_reason
     FROM merged
   )
-SELECT upid, pid, ts, dur
+SELECT
+  upid,
+  pid,
+  ts,
+  dur,
+  unfreeze_reason AS unfreeze_reason_int,
+  _translate_unfreeze_reason(unfreeze_reason) AS unfreeze_reason_str
 FROM starts
 WHERE starts.type = 'freeze' AND upid IS NOT NULL;
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql b/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
index 3baf612..8481657 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
@@ -14,8 +14,7 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.slices;
-INCLUDE PERFETTO MODULE common.timestamps;
+INCLUDE PERFETTO MODULE slices.with_context;
 
 -- Collect all GC slices. There's typically one enclosing slice but sometimes the
 -- CompactionPhase is outside the nesting and we need to include that.
@@ -44,8 +43,14 @@
   gc_name,
   ts AS gc_ts,
   ts,
-  gc_dur + IIF(compact_name = 'CompactionPhase', compact_dur, 0) AS gc_dur,
-  gc_dur + IIF(compact_name = 'CompactionPhase', compact_dur, 0) AS dur,
+  gc_dur + IIF(
+    compact_name = 'CompactionPhase' OR compact_name = 'Background concurrent copying GC',
+    compact_dur,
+    0) AS gc_dur,
+  gc_dur + IIF(
+    compact_name = 'CompactionPhase' OR compact_name = 'Background concurrent copying GC',
+    compact_dur,
+    0) AS dur,
   utid,
   tid,
   upid,
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/input.sql b/src/trace_processor/perfetto_sql/stdlib/android/input.sql
index f344c20..a1d7b11 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/input.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/input.sql
@@ -13,8 +13,6 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
-INCLUDE PERFETTO MODULE common.timestamps;
-
 CREATE PERFETTO TABLE _input_message_sent
 AS
 SELECT
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql b/src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql
index 71920e5..dc222bf 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql
@@ -14,8 +14,6 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.timestamps;
-
 -- All scheduled jobs and their latencies.
 CREATE PERFETTO TABLE android_job_scheduler_events (
   -- Id of the scheduled job assigned by the app developer.
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql b/src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql
index 32e02bc..34a9b97 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql
@@ -14,6 +14,8 @@
 -- limitations under the License.
 --
 
+INCLUDE PERFETTO MODULE android.suspend;
+
 -- Extracts the blocking thread from a slice name
 CREATE PERFETTO FUNCTION android_extract_android_monitor_contention_blocking_thread(
   -- Name of slice
@@ -133,7 +135,8 @@
 -- @column process_name Process name of process experiencing lock contention.
 -- @column id Slice id of lock contention.
 -- @column ts Timestamp of lock contention start.
--- @column dur Duration of lock contention.
+-- @column dur Wall clock duration of lock contention.
+-- @column monotonic_dur Monotonic clock duration of lock contention.
 -- @column track_id Thread track id of blocked thread.
 -- @column is_blocked_main_thread Whether the blocked thread is the main thread.
 -- @column is_blocking_main_thread Whether the blocking thread is the main thread.
@@ -159,6 +162,7 @@
   slice.id,
   slice.ts,
   slice.dur,
+  _extract_duration_without_suspend(slice.ts, slice.dur) AS monotonic_dur,
   slice.track_id,
   thread.is_main_thread AS is_blocked_thread_main,
   thread.tid AS blocked_thread_tid,
@@ -236,7 +240,8 @@
 -- @column process_name Process name of process experiencing lock contention.
 -- @column id Slice id of lock contention.
 -- @column ts Timestamp of lock contention start.
--- @column dur Duration of lock contention.
+-- @column dur Wall clock duration of lock contention.
+-- @column monotonic_dur Monotonic clock duration of lock contention.
 -- @column track_id Thread track id of blocked thread.
 -- @column is_blocked_main_thread Whether the blocked thread is the main thread.
 -- @column is_blocking_main_thread Whether the blocking thread is the main thread.
@@ -299,7 +304,8 @@
 -- @column process_name Process name of process experiencing lock contention.
 -- @column id Slice id of lock contention.
 -- @column ts Timestamp of lock contention start.
--- @column dur Duration of lock contention.
+-- @column dur Wall clock duration of lock contention.
+-- @column monotonic_dur Monotonic clock duration of lock contention.
 -- @column track_id Thread track id of blocked thread.
 -- @column is_blocked_main_thread Whether the blocked thread is the main thread.
 -- @column is_blocking_main_thread Whether the blocking thread is the main thread.
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql b/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql
new file mode 100644
index 0000000..9b7fba8
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql
@@ -0,0 +1,129 @@
+--
+-- Copyright 2024 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT 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 PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE counters.intervals;
+
+-- Converts an oom_adj score Integer to String bucket name.
+CREATE PERFETTO FUNCTION android_oom_adj_score_to_bucket_name(
+  -- oom_adj score.
+  value INT,
+  -- android_app id of the process.
+  android_appid INT)
+-- Returns the oom_adj bucket.
+RETURNS STRING
+AS
+SELECT
+  CASE
+    WHEN $value = -1000 THEN 'native'
+    WHEN $value = -900 THEN 'system'
+    WHEN $value = -800 THEN 'persistent'
+    WHEN $value = -700 THEN 'persistent'
+    WHEN $value = -600 THEN 'logcat'
+    WHEN $value = 0 THEN 'foreground_app'
+    WHEN $value = 50 THEN 'perceptible_foreground_app'
+    WHEN $value BETWEEN 100 AND 199 THEN 'visible_app'
+    WHEN $value BETWEEN 200 AND 224 THEN 'perceptible_app'
+    WHEN $value BETWEEN 225 AND 249 THEN 'perceptible_medium_app'
+    WHEN $value BETWEEN 250 AND 299 THEN 'perceptible_low_app'
+    WHEN $value BETWEEN 300 AND 399 THEN 'backup'
+    WHEN $value BETWEEN 400 AND 499 THEN 'heavy_weight_app'
+    WHEN $value BETWEEN 500 AND 599 THEN 'service'
+    WHEN $value BETWEEN 600 AND 699 THEN 'home_app'
+    WHEN $value BETWEEN 700 AND 799 THEN 'previous_app'
+    WHEN $value BETWEEN 800 AND 899 THEN 'service_b'
+    WHEN $value BETWEEN 900 AND 949 THEN 'cached_app'
+    WHEN $value >= 950 THEN 'cached_app_lmk_first'
+    WHEN $android_appid IS NULL THEN 'unknown'
+    WHEN $android_appid < 10000 THEN 'unknown_native'
+    ELSE 'unknown_app'
+  END;
+
+-- All oom adj state intervals across all processes along with the reason for the state update.
+CREATE PERFETTO TABLE android_oom_adj_intervals (
+  -- Timestamp the oom_adj score of the process changed
+  ts INT,
+  -- Duration until the next oom_adj score change of the process.
+  dur INT,
+  -- oom_adj score of the process.
+  score INT,
+  -- oom_adj bucket of the process.
+  bucket STRING,
+  -- Upid of the process having an oom_adj update.
+  upid INT,
+  -- Name of the process having an oom_adj update.
+  process_name STRING,
+  -- Slice id of the latest oom_adj update in the system_server.
+  oom_adj_id INT,
+  -- Timestamp of the latest oom_adj update in the system_server.
+  oom_adj_ts INT,
+  -- Duration of the latest oom_adj update in the system_server.
+  oom_adj_dur INT,
+  -- Track id of the latest oom_adj update in the system_server
+  oom_adj_track_id INT,
+  -- Thread name of the latest oom_adj update in the system_server.
+  oom_adj_thread_name STRING,
+  -- Reason for the latest oom_adj update in the system_server.
+  oom_adj_reason STRING,
+  -- Trigger for the latest oom_adj update in the system_server.
+  oom_adj_trigger STRING
+  ) AS
+WITH
+  reason AS (
+    SELECT
+      thread_slice.id AS oom_adj_id,
+      thread_slice.ts AS oom_adj_ts,
+      thread_slice.dur AS oom_adj_dur,
+      thread_slice.track_id AS oom_adj_track_id,
+      thread_name AS oom_adj_thread_name,
+      str_split(thread_slice.name, '_', 1) AS oom_adj_reason,
+      slice.name AS oom_adj_trigger,
+      LEAD(thread_slice.ts) OVER (ORDER BY thread_slice.ts) AS oom_adj_next_ts
+    FROM thread_slice
+    LEFT JOIN slice ON slice.id = thread_slice.parent_id AND slice.dur != -1
+    WHERE thread_slice.name GLOB 'updateOomAdj_*' AND process_name = 'system_server'
+  )
+SELECT
+  ts,
+  dur,
+  value AS score,
+  android_oom_adj_score_to_bucket_name(value, android_appid) AS bucket,
+  process.upid,
+  process.name AS process_name,
+  reason.oom_adj_id,
+  reason.oom_adj_ts,
+  reason.oom_adj_dur,
+  reason.oom_adj_track_id,
+  reason.oom_adj_thread_name,
+  reason.oom_adj_reason,
+  reason.oom_adj_trigger
+FROM
+  counter_leading_intervals
+    !(
+      (
+        SELECT counter.*
+        FROM counter
+        JOIN counter_track track
+          ON track.id = counter.track_id AND track.name = 'oom_score_adj'
+      ))
+      counter
+JOIN process_counter_track track
+  ON counter.track_id = track.id
+JOIN process
+  USING (upid)
+LEFT JOIN reason
+  ON counter.ts BETWEEN oom_adj_ts AND COALESCE(oom_adj_next_ts, trace_end())
+WHERE track.name = 'oom_score_adj';
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/services.sql b/src/trace_processor/perfetto_sql/stdlib/android/services.sql
index e9c1c56..f0e854a 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/services.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/services.sql
@@ -14,7 +14,7 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 INCLUDE PERFETTO MODULE android.binder;
 INCLUDE PERFETTO MODULE graphs.search;
 
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
index a38c487..e496e7c 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
@@ -13,12 +13,18 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
-INCLUDE PERFETTO MODULE common.slices;
 INCLUDE PERFETTO MODULE android.process_metadata;
 INCLUDE PERFETTO MODULE android.startup.startups_maxsdk28;
 INCLUDE PERFETTO MODULE android.startup.startups_minsdk29;
 INCLUDE PERFETTO MODULE android.startup.startups_minsdk33;
 
+CREATE PERFETTO FUNCTION _slice_count(
+  -- Name of the slices to counted.
+  slice_glob STRING)
+-- Number of slices with the name.
+RETURNS INT AS
+SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;
+
 -- Gather all startup data. Populate by different sdks.
 CREATE PERFETTO TABLE _all_startups AS
 SELECT sdk, startup_id, ts, ts_end, dur, package, startup_type FROM _startups_maxsdk28
@@ -45,9 +51,9 @@
 ) AS
 SELECT startup_id, ts, ts_end, dur, package, startup_type FROM
 _all_startups WHERE ( CASE
-  WHEN slice_count('launchingActivity#*:*') > 0
+  WHEN _slice_count('launchingActivity#*:*') > 0
     THEN sdk = "minsdk33"
-  WHEN slice_count('MetricsLogger:*') > 0
+  WHEN _slice_count('MetricsLogger:*') > 0
     THEN sdk = "minsdk29"
   ELSE sdk = "maxsdk28"
   END);
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups_minsdk29.sql b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups_minsdk29.sql
index e10244b..fcc1fa9 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups_minsdk29.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups_minsdk29.sql
@@ -29,7 +29,7 @@
   ROW_NUMBER()
   OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS startup_id,
   ts,
-  LEAD(ts, 1, (SELECT end_ts FROM trace_bounds)) OVER(ORDER BY ts) - ts AS dur
+  LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur
 FROM _activity_intent_received
 ORDER BY ts;
 
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/suspend.sql b/src/trace_processor/perfetto_sql/stdlib/android/suspend.sql
index 60236b1..9e604b5 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/suspend.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/suspend.sql
@@ -14,6 +14,8 @@
 -- limitations under the License.
 --
 
+INCLUDE PERFETTO MODULE common.timestamps;
+
 -- Table of suspended and awake slices.
 --
 -- Selects either the minimal or full ftrace source depending on what's
@@ -51,21 +53,21 @@
 awake_slice AS (
   -- If we don't have any rows, use the trace bounds.
   SELECT
-    (SELECT start_ts FROM trace_bounds) AS ts,
-    (SELECT end_ts - start_ts FROM trace_bounds) AS dur
+    trace_start() AS ts,
+    trace_dur() AS dur
   WHERE (SELECT COUNT(*) FROM suspend_slice) = 0
   UNION ALL
   -- If we do have rows, create one slice from the trace start to the first suspend.
   SELECT
-    (SELECT start_ts FROM trace_bounds) AS ts,
-    (SELECT min(ts) FROM suspend_slice) - (SELECT start_ts FROM trace_bounds) AS dur
+    trace_start() AS ts,
+    (SELECT min(ts) FROM suspend_slice) - trace_start() AS dur
   WHERE (SELECT COUNT(*) FROM suspend_slice) != 0
   UNION ALL
   -- And then one slice for each suspend, from the end of the suspend to the
   -- start of the next one (or the end of the trace if there is no next one).
   SELECT
     ts + dur AS ts,
-    ifnull(lead(ts) OVER (ORDER BY ts), (SELECT end_ts FROM trace_bounds)) - ts - dur
+    ifnull(lead(ts) OVER (ORDER BY ts), trace_end()) - ts - dur
       AS dur
   FROM suspend_slice
 )
@@ -74,3 +76,15 @@
 UNION ALL
 SELECT ts, dur, 'suspended' AS power_state
 FROM suspend_slice;
+
+-- Extracts the duration without counting CPU suspended time from an event.
+-- This is the same as converting an event duration from wall clock to monotonic clock.
+-- If there was no CPU suspend, the result is same as |dur|.
+CREATE PERFETTO FUNCTION _extract_duration_without_suspend(
+  -- Timestamp of event.
+  ts INT,
+  -- Duration of event.
+  dur INT)
+RETURNS INT
+AS
+SELECT to_monotonic($ts + $dur) - to_monotonic($ts);
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
index c8d1443..4b00170 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
@@ -7,7 +7,7 @@
 -- chrome instance. Chrome instance id needs to be recorded, and used here in
 -- combination with navigation id to uniquely identify page load metrics.
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 
 CREATE PERFETTO VIEW _fcp_metrics AS
 SELECT
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
index 7cad697..dbe0cca 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
@@ -2,6 +2,8 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
+INCLUDE PERFETTO MODULE slices.with_context;
+
 -- Function to retrieve the upid for a surfaceflinger, as these are attributed
 -- to the GPU but are recorded on a different data source (and track group).
 CREATE PERFETTO FUNCTION _get_process_id_for_surfaceflinger()
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
index d85d7c6..5fb66d6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
@@ -4,7 +4,6 @@
 
 INCLUDE PERFETTO MODULE chrome.chrome_scrolls;
 INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
-INCLUDE PERFETTO MODULE common.slices;
 
 -- Selects EventLatency slices that correspond with janks in a scroll. This is
 -- based on the V3 version of scroll jank metrics.
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
index ce20041..4bc9513 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
@@ -2,13 +2,63 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
 
 -- Hardware info is useful when using sql metrics for analysis
 -- in BTP.
 INCLUDE PERFETTO MODULE chrome.metadata;
 INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3_cause;
 
+-- Checks if slice has a descendant with provided name.
+CREATE PERFETTO FUNCTION _has_descendant_slice_with_name(
+  -- Id of the slice to check descendants of.
+  id INT,
+  -- Name of potential descendant slice.
+  descendant_name STRING
+)
+-- Whether `descendant_name` is a name of an descendant slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+  SELECT 1
+  FROM descendant_slice($id)
+  WHERE name = $descendant_name
+  LIMIT 1
+);
+
+-- Finds the end timestamp for a given slice's descendant with a given name.
+-- If there are multiple descendants with a given name, the function will return the
+-- first one, so it's most useful when working with a timeline broken down into phases,
+-- where each subphase can happen only once.
+CREATE PERFETTO FUNCTION _descendant_slice_end(
+  -- Id of the parent slice.
+  parent_id INT,
+  -- Name of the child with the desired end TS.
+  child_name STRING
+)
+-- End timestamp of the child or NULL if it doesn't exist.
+RETURNS INT AS
+SELECT
+  CASE WHEN s.dur
+    IS NOT -1 THEN s.ts + s.dur
+    ELSE NULL
+  END
+FROM descendant_slice($parent_id) s
+WHERE s.name = $child_name
+LIMIT 1;
+
+-- Given a slice id, returns the name of the slice.
+CREATE PERFETTO FUNCTION _slice_name_from_id(
+  -- The slice id which we need the name for.
+  id LONG
+)
+-- The name of slice with the given id.
+RETURNS STRING AS
+SELECT
+  name
+FROM slice
+WHERE $id = id;
+
+
 -- Grabs all gesture updates with respective scroll ids and start/end
 -- timestamps, regardless of being coalesced.
 CREATE PERFETTO TABLE chrome_gesture_scroll_updates(
@@ -135,8 +185,8 @@
   slice.ts,
   slice.id AS event_latency_id,
   slice.dur AS dur,
-  descendant_slice_end(slice.id, "LatchToSwapEnd") AS input_latency_end_ts,
-  descendant_slice_end(slice.id, "SwapEndToPresentationCompositorFrame") AS presentation_timestamp,
+  _descendant_slice_end(slice.id, "LatchToSwapEnd") AS input_latency_end_ts,
+  _descendant_slice_end(slice.id, "SwapEndToPresentationCompositorFrame") AS presentation_timestamp,
   EXTRACT_ARG(arg_set_id, 'event_latency.event_type') AS event_type
 FROM slice
 WHERE name = "EventLatency"
@@ -144,7 +194,7 @@
           "GESTURE_SCROLL_UPDATE",
           "FIRST_GESTURE_SCROLL_UPDATE",
           "INERTIAL_GESTURE_SCROLL_UPDATE")
-      AND has_descendant_slice_with_name(slice.id, "SwapEndToPresentationCompositorFrame");
+      AND _has_descendant_slice_with_name(slice.id, "SwapEndToPresentationCompositorFrame");
 
 -- Join presented gesture scrolls with their respective event
 -- latencies based on |LatchToSwapEnd| timestamp, as it's the
@@ -384,8 +434,8 @@
   scroll_id INT
 ) AS
 SELECT
-  slice_name_from_id(cause_id) AS cause_of_jank,
-  slice_name_from_id(
+  _slice_name_from_id(cause_id) AS cause_of_jank,
+  _slice_name_from_id(
     -- Getting sub-cause
     chrome_get_v3_jank_cause_id(
       -- Here the cause itself is the parent.
@@ -394,7 +444,7 @@
      (SELECT
       id
       FROM slice
-      WHERE name = slice_name_from_id(cause_id)
+      WHERE name = _slice_name_from_id(cause_id)
         AND parent_id = prev_event_latency_id)
     )) AS sub_cause_of_jank,
   delay_since_last_frame,
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
index d746457..16a5246 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
@@ -2,10 +2,51 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
--- Helper functions for scroll_jank_v3 metric computation.
-
-INCLUDE PERFETTO MODULE common.slices;
-
+-- Finds all slices with a direct parent with the given parent_id.
+CREATE PERFETTO FUNCTION _direct_children_slice(
+  -- Id of the parent slice.
+  parent_id LONG)
+RETURNS TABLE(
+  -- Alias for `slice.id`.
+  id LONG,
+  -- Alias for `slice.type`.
+  type STRING,
+  -- Alias for `slice.ts`.
+  ts LONG,
+  -- Alias for `slice.dur`.
+  dur LONG,
+  -- Alias for `slice.category`.
+  category LONG,
+  -- Alias for `slice.name`.
+  name STRING,
+  -- Alias for `slice.track_id`.
+  track_id LONG,
+  -- Alias for `slice.depth`.
+  depth LONG,
+  -- Alias for `slice.parent_id`.
+  parent_id LONG,
+  -- Alias for `slice.arg_set_id`.
+  arg_set_id LONG,
+  -- Alias for `slice.thread_ts`.
+  thread_ts LONG,
+  -- Alias for `slice.thread_dur`.
+  thread_dur LONG
+) AS
+SELECT
+  slice.id,
+  slice.type,
+  slice.ts,
+  slice.dur,
+  slice.category,
+  slice.name,
+  slice.track_id,
+  slice.depth,
+  slice.parent_id,
+  slice.arg_set_id,
+  slice.thread_ts,
+  slice.thread_dur
+FROM slice
+WHERE parent_id = $parent_id;
 
 -- Given two slice Ids A and B, find the maximum difference
 -- between the durations of it's direct children with matching names
@@ -26,12 +67,12 @@
   current_breakdowns AS (
     SELECT
       *
-    FROM direct_children_slice($janky_slice_id)
+    FROM _direct_children_slice($janky_slice_id)
   ),
   prev_breakdowns AS (
     SELECT
       *
-    FROM direct_children_slice($prev_slice_id)
+    FROM _direct_children_slice($prev_slice_id)
   ),
   joint_breakdowns AS (
     SELECT
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
index f1e852b..7e45848 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
@@ -2,7 +2,7 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 
 -- Access all startups, including those that don't lead to any visible content.
 -- If TimeToFirstVisibleContent is available, then this event will be the
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
index 420ef6b..a177cba 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
@@ -2,7 +2,20 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
-INCLUDE PERFETTO MODULE common.slices;
+-- Checks if slice has an ancestor with provided name.
+CREATE PERFETTO FUNCTION _has_parent_slice_with_name(
+  -- Id of the slice to check parents of.
+  id INT,
+  -- Name of potential ancestor slice.
+  parent_name STRING)
+-- Whether `parent_name` is a name of an ancestor slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+  SELECT 1
+  FROM ancestor_slice($id)
+  WHERE name = $parent_name
+  LIMIT 1
+);
 
 -- Returns the mojo ipc hash for a given task, looking it up from the
 -- argument of descendant ScopedSetIpcHash slice.
@@ -229,11 +242,11 @@
   s1.*,
   -- While the parent slices are too generic to be used by themselves,
   -- they can provide some useful metadata.
-  has_parent_slice_with_name(
+  _has_parent_slice_with_name(
     s1.id,
     "ViewResourceAdapter:captureWithSoftwareDraw"
   ) AS is_software_screenshot,
-  has_parent_slice_with_name(
+  _has_parent_slice_with_name(
     s1.id,
     "ViewResourceAdapter:captureWithHardwareDraw"
   ) AS is_hardware_screenshot
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
index d60992f..76ada01 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
@@ -2,7 +2,7 @@
 -- Use of this source code is governed by a BSD-style license that can be
 -- found in the LICENSE file.
 
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
 
 -- Chrome web content interactions (InteractionToFirstPaint), including
 -- associated high-level metrics and properties.
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/args.sql b/src/trace_processor/perfetto_sql/stdlib/common/args.sql
index df0615a..3d1e793 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/args.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/args.sql
@@ -13,19 +13,8 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
--- Returns the formatted value of a given argument.
--- Similar to EXTRACT_ARG, but instead of returning the raw value, it returns
--- the value formatted according to the 'value_type' column (e.g. for booleans,
--- EXTRACT_ARG will return 0 or 1, while FORMATTED_ARG will return 'true' or
--- 'false').
-CREATE PERFETTO FUNCTION formatted_arg(
-  -- Id of the arg set.
-  arg_set_id INT,
-  -- Key of the argument.
-  arg_key STRING
-)
--- Formatted value of the argument.
-RETURNS STRING AS
-SELECT display_value
-FROM args
-WHERE arg_set_id = $arg_set_id AND key = $arg_key;
\ No newline at end of file
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/counters.sql b/src/trace_processor/perfetto_sql/stdlib/common/counters.sql
index 57429a2..f0c1ce6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/counters.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/counters.sql
@@ -13,89 +13,9 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
-INCLUDE PERFETTO MODULE common.timestamps;
-
--- Timestamp of first counter value in a counter.
-CREATE PERFETTO FUNCTION earliest_timestamp_for_counter_track(
-  -- Id of a counter track with a counter.
-  counter_track_id INT)
--- Timestamp of first counter value. Null if doesn't exist.
-RETURNS LONG AS
-SELECT MIN(ts) FROM counter WHERE counter.track_id = $counter_track_id;
-
--- Counter values with details of counter track with calculated duration of each counter value.
--- Duration is calculated as time from counter to the next counter.
-CREATE PERFETTO FUNCTION counter_with_dur_for_track(
-  -- Id of track counter track.
-  counter_track_id INT)
-RETURNS TABLE(
-    -- Timestamp of the counter value.
-    ts LONG,
-    -- Duration of the counter value.
-    dur LONG,
-    -- Counter value.
-    value DOUBLE,
-    -- Id of the counter track.
-    track_id INT,
-    -- Name of the counter track.
-    track_name STRING,
-    -- Counter track set id.
-    track_arg_set_id INT,
-    -- Counter arg set id.
-    arg_set_id INT
-) AS
-SELECT
-  ts,
-  LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur,
-  value,
-  track.id AS track_id,
-  track.name AS track_name,
-  track.source_arg_set_id AS track_arg_set_id,
-  counter.arg_set_id AS arg_set_id
-FROM counter
-JOIN counter_track track ON track.id = counter.track_id
-WHERE track.id = $counter_track_id;
-
--- COUNTER_WITH_DUR_FOR_TRACK but in a specified time.
--- Does calculation over the table ends - creates an artificial counter value at
--- the start if needed and chops the duration of the last timestamps in range.
-CREATE PERFETTO FUNCTION counter_for_time_range(
-  -- Id of track counter track.
-  counter_track_id INT,
-  -- Timestamp of the timerange start.
-  -- Can be earlier than the first counter value.
-  start_ts LONG,
-  -- Timestamp of the timerange end.
-  end_ts LONG)
-RETURNS TABLE(
-  -- Timestamp of the counter value.
-  ts LONG,
-  -- Duration of the counter value.
-  dur LONG,
-  -- Counter value.
-  value DOUBLE,
-  -- If of the counter track.
-  track_id INT,
-  -- Name of the counter track.
-  track_name STRING,
-  -- Counter track set id.
-  track_arg_set_id INT,
-  -- Counter arg set id.
-  arg_set_id INT
-) AS
-SELECT
-  IIF(ts < $start_ts, $start_ts, ts) AS ts,
-  IIF(
-    ts < $start_ts,
-    dur - ($start_ts - ts),
-    IIF(ts + dur > $end_ts, $end_ts - ts, dur)) AS dur,
-  value,
-  track_id,
-  track_name,
-  track_arg_set_id,
-  arg_set_id
-FROM counter_with_dur_for_track($counter_track_id)
-WHERE TRUE
-  AND ts + dur >= $start_ts
-  AND ts < $end_ts
-ORDER BY ts ASC;
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.counters;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/cpus.sql b/src/trace_processor/perfetto_sql/stdlib/common/cpus.sql
index d897503..7923e86 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/cpus.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/cpus.sql
@@ -13,57 +13,9 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
-
-CREATE PERFETTO TABLE _cpu_sizes AS
-SELECT 0 AS n, 'little' AS size
-UNION
-SELECT 1 AS n, 'mid' AS size
-UNION
-SELECT 2 AS n, 'big' AS size;
-
-CREATE PERFETTO TABLE _ranked_cpus AS
-SELECT
- (DENSE_RANK() OVER win) - 1 AS n,
- cpu
-FROM (
-  SELECT
-    track.cpu AS cpu,
-    MAX(counter.value) AS maxfreq
-  FROM counter
-  JOIN cpu_counter_track AS track
-  ON (counter.track_id = track.id)
-  WHERE track.name = "cpufreq"
-  GROUP BY track.cpu
-)
-WINDOW win AS (ORDER BY maxfreq);
-
--- Guess size of CPU.
--- On some multicore devices the cores are heterogeneous and divided
--- into two or more 'sizes'. In a typical case a device might have 8
--- cores of which 4 are 'little' (low power & low performance) and 4
--- are 'big' (high power & high performance). This functions attempts
--- to map a given CPU index onto the relevant descriptor. For
--- homogeneous systems this returns NULL.
-CREATE PERFETTO FUNCTION guess_cpu_size(
-  -- Index of the CPU whose size we will guess.
-  cpu_index INT)
--- A descriptive size ('little', 'mid', 'big', etc) or NULL if we have insufficient information.
-RETURNS STRING AS
-SELECT
-  IIF((SELECT COUNT(DISTINCT n) FROM _ranked_cpus) >= 2, size, null) as size
-FROM _ranked_cpus
-LEFT JOIN _cpu_sizes USING(n)
-WHERE cpu = $cpu_index;
-
-
--- A list of CPUs with their sizes.
-CREATE PERFETTO TABLE cpus(
-  -- Index of the CPU.
-  cpu_index INT,
-  -- A descriptive size ('little', 'mid', 'big', etc) or NULL if we have insufficient information.
-  size STRING
-) AS
-SELECT
-  cpu as cpu_index,
-  guess_cpu_size(cpu) AS size
-FROM _ranked_cpus;
\ No newline at end of file
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.cpus;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/metadata.sql b/src/trace_processor/perfetto_sql/stdlib/common/metadata.sql
index e667477..bd1a0fd 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/metadata.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/metadata.sql
@@ -13,10 +13,9 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
--- Extracts an int value with the given name from the metadata table.
-CREATE PERFETTO FUNCTION extract_int_metadata(
-  -- The name of the metadata entry.
-  name STRING)
--- int_value for the given name. NULL if there's no such entry.
-RETURNS LONG AS
-SELECT int_value FROM metadata WHERE name = ($name);
\ No newline at end of file
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.metadata;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/percentiles.sql b/src/trace_processor/perfetto_sql/stdlib/common/percentiles.sql
index 47ecde0..525c95c 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/percentiles.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/percentiles.sql
@@ -13,106 +13,9 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
-INCLUDE PERFETTO MODULE common.counters;
-INCLUDE PERFETTO MODULE common.timestamps;
-
-CREATE PERFETTO FUNCTION _number_generator(upper_limit INT)
-RETURNS TABLE(num INT) AS
-WITH nums AS
-    (SELECT 1 num UNION SELECT num + 1
-    from NUMS
-    WHERE num < $upper_limit)
-SELECT num FROM nums;
-
+-- No new changes allowed. Will be removed after v45 of Perfetto.
 --
--- Get durations for percentile
---
-
--- All percentiles (range 1-100) for counter track ID in a given time range.
---
--- Percentiles are calculated by:
--- 1. Dividing the sum of duration in time range for each value in the counter
--- by duration of the counter in range. This gives us `percentile_for)value` (DOUBLE).
--- 2. Fetching each percentile by taking floor of each `percentile_for_value`, grouping by
--- resulting `percentile` and MIN from value for each grouping. As we are rounding down,
--- taking MIN assures most reliable data.
--- 3. Filling the possible gaps in percentiles by getting the minimal value from higher
--- percentiles for each gap.
-CREATE PERFETTO FUNCTION counter_percentiles_for_time_range(
-  -- Id of the counter track.
-  counter_track_id INT,
-  -- Timestamp of start of time range.
-  start_ts LONG,
-  -- Timestamp of end of time range.
-  end_ts LONG)
-RETURNS TABLE(
-  -- All of the numbers from 1 to 100.
-  percentile INT,
-  -- Value for the percentile.
-  value DOUBLE
-) AS
-WITH percentiles_for_value AS (
-    SELECT
-        value,
-        (CAST(SUM(dur) OVER(ORDER BY value ASC) AS DOUBLE) /
-            ($end_ts - MAX($start_ts, earliest_timestamp_for_counter_track($counter_track_id)))) * 100
-        AS percentile_for_value
-    FROM COUNTER_FOR_TIME_RANGE($counter_track_id, $start_ts, $end_ts)
-    ORDER BY value ASC
-),
-with_gaps AS (
-    SELECT
-        CAST(percentile_for_value AS INT) AS percentile,
-        MIN(value) AS value
-    FROM percentiles_for_value
-    GROUP BY percentile
-    ORDER BY percentile ASC)
-SELECT
-    num AS percentile,
-    IFNULL(value, MIN(value) OVER (ORDER BY percentile DESC)) AS value
-FROM _NUMBER_GENERATOR(100) AS nums
-LEFT JOIN with_gaps ON with_gaps.percentile = nums.num
-ORDER BY percentile DESC;
-
--- All percentiles (range 1-100) for counter track ID.
-CREATE PERFETTO FUNCTION counter_percentiles_for_track(
-  -- Id of the counter track.
-  counter_track_id INT)
-RETURNS TABLE(
-  -- All of the numbers from 1 to 100.
-  percentile INT,
-  -- Value for the percentile.
-  value DOUBLE
-) AS
-SELECT *
-FROM counter_percentiles_for_time_range(
-  $counter_track_id, trace_start(), trace_end());
-
--- Value for specific percentile (range 1-100) for counter track ID in time range.
-CREATE PERFETTO FUNCTION counter_track_percentile_for_time(
-  -- Id of the counter track.
-  counter_track_id INT,
-  -- Any of the numbers from 1 to 100.
-  percentile INT,
-  -- Timestamp of start of time range.
-  start_ts LONG,
-  -- Timestamp of end of time range.
-  end_ts LONG)
--- Value for the percentile.
-RETURNS DOUBLE AS
-SELECT value
-FROM counter_percentiles_for_time_range($counter_track_id, $start_ts, $end_ts)
-WHERE percentile = $percentile;
-
--- Value for specific percentile (range 1-100) for counter track ID.
-CREATE PERFETTO FUNCTION counter_track_percentile(
-  -- Id of the counter track.
-  counter_track_id INT,
-  -- Any of the numbers from 1 to 100.
-  percentile INT)
--- Value for the percentile.
-RETURNS DOUBLE AS
-SELECT counter_track_percentile_for_time($counter_track_id,
-                                         $percentile,
-                                         trace_start(),
-                                         trace_end());
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.percentiles;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/slices.sql b/src/trace_processor/perfetto_sql/stdlib/common/slices.sql
index 84badb6..d5d70c9 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/slices.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/slices.sql
@@ -13,244 +13,9 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
--- All thread slices with data about thread, thread track and process.
--- Where possible, use available view functions which filter this view.
-CREATE PERFETTO VIEW thread_slice(
-  -- Alias for `slice.id`.
-  id INT,
-  -- Alias for `slice.type`.
-  type STRING,
-  -- Alias for `slice.ts`.
-  ts INT,
-  -- Alias for `slice.dur`.
-  dur INT,
-  -- Alias for `slice.category`.
-  category STRING,
-  -- Alias for `slice.name`.
-  name STRING,
-  -- Alias for `slice.track_id`.
-  track_id INT,
-  -- Alias for `thread_track.name`.
-  track_name STRING,
-  -- Alias for `thread.name`.
-  thread_name STRING,
-  -- Alias for `thread.utid`.
-  utid INT,
-  -- Alias for `thread.tid`
-  tid INT,
-  -- Alias for `process.name`.
-  process_name STRING,
-  -- Alias for `process.upid`.
-  upid INT,
-  -- Alias for `process.pid`.
-  pid INT,
-  -- Alias for `slice.depth`.
-  depth INT,
-  -- Alias for `slice.parent_id`.
-  parent_id INT,
-  -- Alias for `slice.arg_set_id`.
-  arg_set_id INT,
-  -- Alias for `slice.thread_ts`.
-  thread_ts INT,
-  -- Alias for `slice.thread_dur`.
-  thread_dur INT
-) AS
-SELECT
-  slice.id,
-  slice.type,
-  slice.ts,
-  slice.dur,
-  slice.category,
-  slice.name,
-  slice.track_id,
-  thread_track.name AS track_name,
-  thread.name AS thread_name,
-  thread.utid,
-  thread.tid,
-  process.name AS process_name,
-  process.upid,
-  process.pid,
-  slice.depth,
-  slice.parent_id,
-  slice.arg_set_id,
-  slice.thread_ts,
-  slice.thread_dur
-FROM slice
-JOIN thread_track ON slice.track_id = thread_track.id
-JOIN thread USING (utid)
-LEFT JOIN process USING (upid);
-
--- All process slices with data about process track and process.
--- Where possible, use available view functions which filter this view.
-CREATE PERFETTO VIEW process_slice(
-  -- Alias for `slice.id`.
-  id INT,
-  -- Alias for `slice.type`.
-  type STRING,
-  -- Alias for `slice.ts`.
-  ts INT,
-  -- Alias for `slice.dur`.
-  dur INT,
-  -- Alias for `slice.category`.
-  category STRING,
-  -- Alias for `slice.name`.
-  name STRING,
-  -- Alias for `slice.track_id`.
-  track_id INT,
-  -- Alias for `process_track.name`.
-  track_name STRING,
-  -- Alias for `process.name`.
-  process_name STRING,
-  -- Alias for `process.upid`.
-  upid INT,
-  -- Alias for `process.pid`.
-  pid INT,
-  -- Alias for `slice.depth`.
-  depth INT,
-  -- Alias for `slice.parent_id`.
-  parent_id INT,
-  -- Alias for `slice.arg_set_id`.
-  arg_set_id INT,
-  -- Alias for `slice.thread_ts`.
-  thread_ts INT,
-  -- Alias for `slice.thread_dur`.
-  thread_dur INT
-) AS
-SELECT
-  slice.id,
-  slice.type,
-  slice.ts,
-  slice.dur,
-  slice.category,
-  slice.name,
-  slice.track_id,
-  process_track.name AS track_name,
-  process.name AS process_name,
-  process.upid,
-  process.pid,
-  slice.depth,
-  slice.parent_id,
-  slice.arg_set_id,
-  slice.thread_ts,
-  slice.thread_dur
-FROM slice
-JOIN process_track ON slice.track_id = process_track.id
-JOIN process USING (upid);
-
--- Checks if slice has an ancestor with provided name.
-CREATE PERFETTO FUNCTION has_parent_slice_with_name(
-  -- Id of the slice to check parents of.
-  id INT,
-  -- Name of potential ancestor slice.
-  parent_name STRING)
--- Whether `parent_name` is a name of an ancestor slice.
-RETURNS BOOL AS
-SELECT EXISTS(
-  SELECT 1
-  FROM ancestor_slice($id)
-  WHERE name = $parent_name
-  LIMIT 1
-);
-
--- Checks if slice has a descendant with provided name.
-CREATE PERFETTO FUNCTION has_descendant_slice_with_name(
-  -- Id of the slice to check descendants of.
-  id INT,
-  -- Name of potential descendant slice.
-  descendant_name STRING
-)
--- Whether `descendant_name` is a name of an descendant slice.
-RETURNS BOOL AS
-SELECT EXISTS(
-  SELECT 1
-  FROM descendant_slice($id)
-  WHERE name = $descendant_name
-  LIMIT 1
-);
-
--- Count slices with specified name.
-CREATE PERFETTO FUNCTION slice_count(
-  -- Name of the slices to counted.
-  slice_glob STRING)
--- Number of slices with the name.
-RETURNS INT AS
-SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;;
-
--- Finds the end timestamp for a given slice's descendant with a given name.
--- If there are multiple descendants with a given name, the function will return the
--- first one, so it's most useful when working with a timeline broken down into phases,
--- where each subphase can happen only once.
-CREATE PERFETTO FUNCTION descendant_slice_end(
-  -- Id of the parent slice.
-  parent_id INT,
-  -- Name of the child with the desired end TS.
-  child_name STRING
-)
--- End timestamp of the child or NULL if it doesn't exist.
-RETURNS INT AS
-SELECT
-  CASE WHEN s.dur
-    IS NOT -1 THEN s.ts + s.dur
-    ELSE NULL
-  END
-FROM descendant_slice($parent_id) s
-WHERE s.name = $child_name
-LIMIT 1;
-
--- Finds all slices with a direct parent with the given parent_id.
-CREATE PERFETTO FUNCTION direct_children_slice(
-  -- Id of the parent slice.
-  parent_id LONG)
-RETURNS TABLE(
-  -- Alias for `slice.id`.
-  id LONG,
-  -- Alias for `slice.type`.
-  type STRING,
-  -- Alias for `slice.ts`.
-  ts LONG,
-  -- Alias for `slice.dur`.
-  dur LONG,
-  -- Alias for `slice.category`.
-  category LONG,
-  -- Alias for `slice.name`.
-  name STRING,
-  -- Alias for `slice.track_id`.
-  track_id LONG,
-  -- Alias for `slice.depth`.
-  depth LONG,
-  -- Alias for `slice.parent_id`.
-  parent_id LONG,
-  -- Alias for `slice.arg_set_id`.
-  arg_set_id LONG,
-  -- Alias for `slice.thread_ts`.
-  thread_ts LONG,
-  -- Alias for `slice.thread_dur`.
-  thread_dur LONG
-) AS
-SELECT
-  slice.id,
-  slice.type,
-  slice.ts,
-  slice.dur,
-  slice.category,
-  slice.name,
-  slice.track_id,
-  slice.depth,
-  slice.parent_id,
-  slice.arg_set_id,
-  slice.thread_ts,
-  slice.thread_dur
-FROM slice
-WHERE parent_id = $parent_id;
-
--- Given a slice id, returns the name of the slice.
-CREATE PERFETTO FUNCTION slice_name_from_id(
-  -- The slice id which we need the name for.
-  id LONG
-)
--- The name of slice with the given id.
-RETURNS STRING AS
-SELECT
-  name
-FROM slice
-WHERE $id = id;
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/thread_states.sql b/src/trace_processor/perfetto_sql/stdlib/common/thread_states.sql
index d43d6a1..a21e9da 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/thread_states.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/thread_states.sql
@@ -13,107 +13,9 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
-INCLUDE PERFETTO MODULE common.timestamps;
-INCLUDE PERFETTO MODULE common.cpus;
-
--- TODO(altimin): this doesn't handle some corner cases which thread_state.ts
--- handles (as complex strings manipulations in SQL are pretty painful),
--- but they are pretty niche.
--- Translates the thread state name from a single-letter shorthard to
--- a human-readable name.
-CREATE PERFETTO FUNCTION _translate_thread_state_name(name STRING)
-RETURNS STRING AS
-SELECT CASE $name
-WHEN 'Running' THEN 'Running'
-WHEN 'R' THEN 'Runnable'
-WHEN 'R+' THEN 'Runnable (Preempted)'
-WHEN 'S' THEN 'Sleeping'
-WHEN 'D' THEN 'Uninterruptible Sleep'
-WHEN 'T' THEN 'Stopped'
-WHEN 't' THEN 'Traced'
-WHEN 'X' THEN 'Exit (Dead)'
-WHEN 'Z' THEN 'Exit (Zombie)'
-WHEN 'x' THEN 'Task Dead'
-WHEN 'I' THEN 'Idle'
-WHEN 'K' THEN 'Wakekill'
-WHEN 'W' THEN 'Waking'
-WHEN 'P' THEN 'Parked'
-WHEN 'N' THEN 'No Load'
-ELSE $name
-END;
-
--- Returns a human-readable name for a thread state.
-CREATE PERFETTO FUNCTION human_readable_thread_state_name(
-  -- Thread state id.
-  id INT)
--- Human-readable name for the thread state.
-RETURNS STRING AS
-WITH data AS (
-  SELECT
-    _translate_thread_state_name(state) AS state,
-    (CASE io_wait
-      WHEN 1 THEN ' (IO)'
-      WHEN 0 THEN ' (non-IO)'
-      ELSE ''
-    END) AS io_wait
-  FROM thread_state
-  WHERE id = $id
-)
-SELECT
-  printf('%s%s', state, io_wait)
-FROM data;
-
--- Returns an aggregation of thread states (by state and cpu) for a given
--- interval of time for a given thread.
-CREATE PERFETTO FUNCTION thread_state_summary_for_interval(
-  -- The start of the interval.
-  ts INT,
-  -- The duration of the interval.
-  dur INT,
-  -- The utid of the thread.
-  utid INT)
-RETURNS TABLE(
-  -- Human-readable thread state name.
-  state STRING,
-  -- Raw thread state name, alias of `thread_state.state`.
-  raw_state STRING,
-  -- The type of CPU if available (e.g. "big" / "mid" / "little").
-  cpu_type STRING,
-  -- The CPU index.
-  cpu INT,
-  -- The name of the kernel function execution is blocked in.
-  blocked_function STRING,
-  -- The total duration.
-  dur INT
-) AS
-WITH
-states_starting_inside AS (
-  SELECT id
-  FROM thread_state
-  WHERE $ts <= ts
-    AND ts <= $ts + $dur
-    AND utid = $utid
-),
-first_state_starting_before AS (
-  SELECT id
-  FROM thread_state
-  WHERE ts < $ts AND utid = $utid
-  ORDER BY ts DESC
-  LIMIT 1
-),
-relevant_states AS (
-  SELECT * FROM states_starting_inside
-  UNION ALL
-  SELECT * FROM first_state_starting_before
-)
-SELECT
-  human_readable_thread_state_name(id) as state,
-  state as raw_state,
-  guess_cpu_size(cpu) as cpu_type,
-  cpu,
-  blocked_function,
-  sum(spans_overlapping_dur($ts, $dur, ts, dur)) as dur
-FROM thread_state
-JOIN relevant_states USING (id)
-GROUP BY state, raw_state, cpu_type, cpu, blocked_function
-ORDER BY dur desc;
\ No newline at end of file
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.thread_states;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/timestamps.sql b/src/trace_processor/perfetto_sql/stdlib/common/timestamps.sql
index 81b89a4..8f91d3b 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/timestamps.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/timestamps.sql
@@ -13,137 +13,9 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
+-- No new changes allowed. Will be removed after v45 of Perfetto.
 --
--- Trace bounds
---
-
--- Fetch start of the trace.
-CREATE PERFETTO FUNCTION trace_start()
--- Start of the trace in nanoseconds.
-RETURNS LONG AS
-SELECT start_ts FROM trace_bounds;
-
--- Fetch end of the trace.
-CREATE PERFETTO FUNCTION trace_end()
--- End of the trace in nanoseconds.
-RETURNS LONG AS
-SELECT end_ts FROM trace_bounds;
-
--- Fetch duration of the trace.
-CREATE PERFETTO FUNCTION trace_dur()
--- Duration of the trace in nanoseconds.
-RETURNS LONG AS
-SELECT trace_end() - trace_start();
-
--- Checks whether two spans are overlapping.
-CREATE PERFETTO FUNCTION is_spans_overlapping(
-  -- Start of first span.
-  ts1 LONG,
-  -- End of first span.
-  ts_end1 LONG,
-  -- Start of second span.
-  ts2 LONG,
-  -- End of second span.
-  ts_end2 LONG)
--- Whether two spans are overlapping.
-RETURNS BOOL AS
-SELECT (IIF($ts1 < $ts2, $ts2, $ts1)
-      < IIF($ts_end1 < $ts_end2, $ts_end1, $ts_end2));
-
---Return the overlapping duration between two spans.
---If either duration is less than 0 or there's no intersection, 0 is returned
-CREATE PERFETTO FUNCTION spans_overlapping_dur(
-  -- Timestamp of first slice start.
-  ts1 LONG,
-  -- Duration of first slice.
-  dur1 LONG,
-  -- Timestamp of second slice start.
-  ts2 LONG,
-  -- Duration of second slice.
-  dur2 LONG
-)
--- Overlapping duration
-RETURNS INT AS
-SELECT
-  CASE
-    WHEN $dur1 = -1 OR $dur2 = -1 THEN 0
-    WHEN $ts1 + $dur1 < $ts2 OR $ts2 + $dur2 < $ts1 THEN 0
-    WHEN ($ts1 >= $ts2) AND ($ts1 + $dur1 <= $ts2 + $dur2) THEN $dur1
-    WHEN ($ts1 < $ts2) AND ($ts1 + $dur1 < $ts2 + $dur2) THEN $ts1 + $dur1 - $ts2
-    WHEN ($ts1 > $ts2) AND ($ts1 + $dur1 > $ts2 + $dur2) THEN $ts2 + $dur2 - $ts1
-    ELSE $dur2
-  END;
-
---
--- Helpers for defining time durations.
---
-
--- Converts a duration in seconds to nanoseconds, which is the default representation
--- of time durations in trace processor. Provided for consisensy with other functions.
-CREATE PERFETTO FUNCTION ns(
-  -- Time duration in nanoseconds.
-  nanos INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $nanos;
-
--- Converts a duration in microseconds to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION us(
-  -- Time duration in microseconds.
-  micros INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $micros * 1000;
-
--- Converts a duration in millseconds to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION ms(
-  -- Time duration in milliseconds.
-  millis INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $millis * 1000 * 1000;
-
--- Converts a duration in seconds to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION seconds(
-  -- Time duration in seconds.
-  seconds INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $seconds * 1000 * 1000 * 1000;
-
--- Converts a duration in minutes to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION minutes(
-  -- Time duration in minutes.
-  minutes INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $minutes * 60 * 1000 * 1000 * 1000;
-
--- Converts a duration in hours to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION hours(
-  -- Time duration in hours.
-  hours INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $hours * 60 * 60 * 1000 * 1000 * 1000;
-
--- Converts a duration in days to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION days(
-  -- Time duration in days.
-  days INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $days * 24 * 60 * 60 * 1000 * 1000 * 1000;
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.timestamps;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/counters/intervals.sql b/src/trace_processor/perfetto_sql/stdlib/counters/intervals.sql
index 4bc69ce..4b11c7c 100644
--- a/src/trace_processor/perfetto_sql/stdlib/counters/intervals.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/counters/intervals.sql
@@ -14,8 +14,6 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.timestamps;
-
 -- For a given counter timeline (e.g. a single counter track), returns
 -- intervals of time where the counter has the same value.
 --
@@ -27,33 +25,38 @@
 --
 -- For example, suppose we have the following data:
 -- ```
--- ts=0, value=10
--- ts=10, value=10
--- ts=20, value=30
+-- ts=0, value=10, track_id=1
+-- ts=0, value=10, track_id=2
+-- ts=10, value=10, track_id=1
+-- ts=10, value=20, track_id=2
+-- ts=20, value=30, track_id=1
 -- [end of trace at ts = 40]
 -- ```
 --
 -- Then this macro will generate the following intervals:
 -- ```
--- ts=0, dur=20, value=10
--- ts=20, dur=10, value=30
+-- ts=0, dur=20, value=10, track_id=1
+-- ts=20, dur=10, value=30, track_id=1
+-- ts=0, dur=10, value=10, track_id=2
+-- ts=10, dur=30, value=20, track_id=2
 -- ```
 CREATE PERFETTO MACRO counter_leading_intervals(
   -- A table/view/subquery corresponding to a "counter-like" table.
-  -- This table must have the columns "id" and "ts" and "value" corresponding
-  -- to an id, timestamp and associated counter value.
+  -- This table must have the columns "id" and "ts" and "track_id" and "value" corresponding
+  -- to an id, timestamp, counter track_id and associated counter value.
   counter_table TableOrSubquery)
--- Table with the schema (id UINT32, ts UINT64, value DOUBLE, dur INT).
+-- Table with the schema (id UINT32, ts UINT64, track_id UINT64, value DOUBLE, dur INT).
 RETURNS TableOrSubquery AS
 (
   WITH base AS (
-    SELECT id, ts, value, LAG(value) OVER (ORDER BY ts) AS lag_value
+    SELECT id, ts, track_id, value, LAG(value) OVER (PARTITION BY track_id ORDER BY ts) AS lag_value
     FROM $counter_table
   )
   SELECT
     id,
     ts,
-    LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur,
+    track_id,
+    LEAD(ts, 1, trace_end()) OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
     CAST(value AS INT) AS value
   FROM base
   WHERE value != lag_value OR lag_value IS NULL
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/deprecated/BUILD.gn
new file mode 100644
index 0000000..1e92f31
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright (C) 2024 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.
+
+import("../../../../../gn/perfetto_sql.gni")
+
+perfetto_sql_source_set("deprecated") {
+  sources = [ "v42/common" ]
+}
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/BUILD.gn
new file mode 100644
index 0000000..08597bb
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/BUILD.gn
@@ -0,0 +1,28 @@
+# Copyright (C) 2022 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.
+
+import("../../../../../../../gn/perfetto_sql.gni")
+
+perfetto_sql_source_set("common") {
+  sources = [
+    "args.sql",
+    "counters.sql",
+    "cpus.sql",
+    "metadata.sql",
+    "percentiles.sql",
+    "slices.sql",
+    "thread_states.sql",
+    "timestamps.sql",
+  ]
+}
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/args.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/args.sql
new file mode 100644
index 0000000..df0615a
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/args.sql
@@ -0,0 +1,31 @@
+--
+-- Copyright 2023 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT 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 the formatted value of a given argument.
+-- Similar to EXTRACT_ARG, but instead of returning the raw value, it returns
+-- the value formatted according to the 'value_type' column (e.g. for booleans,
+-- EXTRACT_ARG will return 0 or 1, while FORMATTED_ARG will return 'true' or
+-- 'false').
+CREATE PERFETTO FUNCTION formatted_arg(
+  -- Id of the arg set.
+  arg_set_id INT,
+  -- Key of the argument.
+  arg_key STRING
+)
+-- Formatted value of the argument.
+RETURNS STRING AS
+SELECT display_value
+FROM args
+WHERE arg_set_id = $arg_set_id AND key = $arg_key;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/counters.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/counters.sql
new file mode 100644
index 0000000..7923c52
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/counters.sql
@@ -0,0 +1,101 @@
+--
+-- Copyright 2023 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT 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 PERFETTO MODULE deprecated.v42.common.timestamps;
+
+-- Timestamp of first counter value in a counter.
+CREATE PERFETTO FUNCTION earliest_timestamp_for_counter_track(
+  -- Id of a counter track with a counter.
+  counter_track_id INT)
+-- Timestamp of first counter value. Null if doesn't exist.
+RETURNS LONG AS
+SELECT MIN(ts) FROM counter WHERE counter.track_id = $counter_track_id;
+
+-- Counter values with details of counter track with calculated duration of each counter value.
+-- Duration is calculated as time from counter to the next counter.
+CREATE PERFETTO FUNCTION counter_with_dur_for_track(
+  -- Id of track counter track.
+  counter_track_id INT)
+RETURNS TABLE(
+    -- Timestamp of the counter value.
+    ts LONG,
+    -- Duration of the counter value.
+    dur LONG,
+    -- Counter value.
+    value DOUBLE,
+    -- Id of the counter track.
+    track_id INT,
+    -- Name of the counter track.
+    track_name STRING,
+    -- Counter track set id.
+    track_arg_set_id INT,
+    -- Counter arg set id.
+    arg_set_id INT
+) AS
+SELECT
+  ts,
+  LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur,
+  value,
+  track.id AS track_id,
+  track.name AS track_name,
+  track.source_arg_set_id AS track_arg_set_id,
+  counter.arg_set_id AS arg_set_id
+FROM counter
+JOIN counter_track track ON track.id = counter.track_id
+WHERE track.id = $counter_track_id;
+
+-- COUNTER_WITH_DUR_FOR_TRACK but in a specified time.
+-- Does calculation over the table ends - creates an artificial counter value at
+-- the start if needed and chops the duration of the last timestamps in range.
+CREATE PERFETTO FUNCTION counter_for_time_range(
+  -- Id of track counter track.
+  counter_track_id INT,
+  -- Timestamp of the timerange start.
+  -- Can be earlier than the first counter value.
+  start_ts LONG,
+  -- Timestamp of the timerange end.
+  end_ts LONG)
+RETURNS TABLE(
+  -- Timestamp of the counter value.
+  ts LONG,
+  -- Duration of the counter value.
+  dur LONG,
+  -- Counter value.
+  value DOUBLE,
+  -- If of the counter track.
+  track_id INT,
+  -- Name of the counter track.
+  track_name STRING,
+  -- Counter track set id.
+  track_arg_set_id INT,
+  -- Counter arg set id.
+  arg_set_id INT
+) AS
+SELECT
+  IIF(ts < $start_ts, $start_ts, ts) AS ts,
+  IIF(
+    ts < $start_ts,
+    dur - ($start_ts - ts),
+    IIF(ts + dur > $end_ts, $end_ts - ts, dur)) AS dur,
+  value,
+  track_id,
+  track_name,
+  track_arg_set_id,
+  arg_set_id
+FROM counter_with_dur_for_track($counter_track_id)
+WHERE TRUE
+  AND ts + dur >= $start_ts
+  AND ts < $end_ts
+ORDER BY ts ASC;
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/cpus.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/cpus.sql
new file mode 100644
index 0000000..d897503
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/cpus.sql
@@ -0,0 +1,69 @@
+--
+-- Copyright 2023 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+
+CREATE PERFETTO TABLE _cpu_sizes AS
+SELECT 0 AS n, 'little' AS size
+UNION
+SELECT 1 AS n, 'mid' AS size
+UNION
+SELECT 2 AS n, 'big' AS size;
+
+CREATE PERFETTO TABLE _ranked_cpus AS
+SELECT
+ (DENSE_RANK() OVER win) - 1 AS n,
+ cpu
+FROM (
+  SELECT
+    track.cpu AS cpu,
+    MAX(counter.value) AS maxfreq
+  FROM counter
+  JOIN cpu_counter_track AS track
+  ON (counter.track_id = track.id)
+  WHERE track.name = "cpufreq"
+  GROUP BY track.cpu
+)
+WINDOW win AS (ORDER BY maxfreq);
+
+-- Guess size of CPU.
+-- On some multicore devices the cores are heterogeneous and divided
+-- into two or more 'sizes'. In a typical case a device might have 8
+-- cores of which 4 are 'little' (low power & low performance) and 4
+-- are 'big' (high power & high performance). This functions attempts
+-- to map a given CPU index onto the relevant descriptor. For
+-- homogeneous systems this returns NULL.
+CREATE PERFETTO FUNCTION guess_cpu_size(
+  -- Index of the CPU whose size we will guess.
+  cpu_index INT)
+-- A descriptive size ('little', 'mid', 'big', etc) or NULL if we have insufficient information.
+RETURNS STRING AS
+SELECT
+  IIF((SELECT COUNT(DISTINCT n) FROM _ranked_cpus) >= 2, size, null) as size
+FROM _ranked_cpus
+LEFT JOIN _cpu_sizes USING(n)
+WHERE cpu = $cpu_index;
+
+
+-- A list of CPUs with their sizes.
+CREATE PERFETTO TABLE cpus(
+  -- Index of the CPU.
+  cpu_index INT,
+  -- A descriptive size ('little', 'mid', 'big', etc) or NULL if we have insufficient information.
+  size STRING
+) AS
+SELECT
+  cpu as cpu_index,
+  guess_cpu_size(cpu) AS size
+FROM _ranked_cpus;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/metadata.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/metadata.sql
new file mode 100644
index 0000000..e667477
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/metadata.sql
@@ -0,0 +1,22 @@
+--
+-- Copyright 2022 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- Extracts an int value with the given name from the metadata table.
+CREATE PERFETTO FUNCTION extract_int_metadata(
+  -- The name of the metadata entry.
+  name STRING)
+-- int_value for the given name. NULL if there's no such entry.
+RETURNS LONG AS
+SELECT int_value FROM metadata WHERE name = ($name);
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/percentiles.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/percentiles.sql
new file mode 100644
index 0000000..78e1ed1
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/percentiles.sql
@@ -0,0 +1,118 @@
+--
+-- Copyright 2023 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT 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 PERFETTO MODULE deprecated.v42.common.counters;
+INCLUDE PERFETTO MODULE deprecated.v42.common.timestamps;
+
+CREATE PERFETTO FUNCTION _number_generator(upper_limit INT)
+RETURNS TABLE(num INT) AS
+WITH nums AS
+    (SELECT 1 num UNION SELECT num + 1
+    from NUMS
+    WHERE num < $upper_limit)
+SELECT num FROM nums;
+
+--
+-- Get durations for percentile
+--
+
+-- All percentiles (range 1-100) for counter track ID in a given time range.
+--
+-- Percentiles are calculated by:
+-- 1. Dividing the sum of duration in time range for each value in the counter
+-- by duration of the counter in range. This gives us `percentile_for)value` (DOUBLE).
+-- 2. Fetching each percentile by taking floor of each `percentile_for_value`, grouping by
+-- resulting `percentile` and MIN from value for each grouping. As we are rounding down,
+-- taking MIN assures most reliable data.
+-- 3. Filling the possible gaps in percentiles by getting the minimal value from higher
+-- percentiles for each gap.
+CREATE PERFETTO FUNCTION counter_percentiles_for_time_range(
+  -- Id of the counter track.
+  counter_track_id INT,
+  -- Timestamp of start of time range.
+  start_ts LONG,
+  -- Timestamp of end of time range.
+  end_ts LONG)
+RETURNS TABLE(
+  -- All of the numbers from 1 to 100.
+  percentile INT,
+  -- Value for the percentile.
+  value DOUBLE
+) AS
+WITH percentiles_for_value AS (
+    SELECT
+        value,
+        (CAST(SUM(dur) OVER(ORDER BY value ASC) AS DOUBLE) /
+            ($end_ts - MAX($start_ts, earliest_timestamp_for_counter_track($counter_track_id)))) * 100
+        AS percentile_for_value
+    FROM COUNTER_FOR_TIME_RANGE($counter_track_id, $start_ts, $end_ts)
+    ORDER BY value ASC
+),
+with_gaps AS (
+    SELECT
+        CAST(percentile_for_value AS INT) AS percentile,
+        MIN(value) AS value
+    FROM percentiles_for_value
+    GROUP BY percentile
+    ORDER BY percentile ASC)
+SELECT
+    num AS percentile,
+    IFNULL(value, MIN(value) OVER (ORDER BY percentile DESC)) AS value
+FROM _NUMBER_GENERATOR(100) AS nums
+LEFT JOIN with_gaps ON with_gaps.percentile = nums.num
+ORDER BY percentile DESC;
+
+-- All percentiles (range 1-100) for counter track ID.
+CREATE PERFETTO FUNCTION counter_percentiles_for_track(
+  -- Id of the counter track.
+  counter_track_id INT)
+RETURNS TABLE(
+  -- All of the numbers from 1 to 100.
+  percentile INT,
+  -- Value for the percentile.
+  value DOUBLE
+) AS
+SELECT *
+FROM counter_percentiles_for_time_range(
+  $counter_track_id, trace_start(), trace_end());
+
+-- Value for specific percentile (range 1-100) for counter track ID in time range.
+CREATE PERFETTO FUNCTION counter_track_percentile_for_time(
+  -- Id of the counter track.
+  counter_track_id INT,
+  -- Any of the numbers from 1 to 100.
+  percentile INT,
+  -- Timestamp of start of time range.
+  start_ts LONG,
+  -- Timestamp of end of time range.
+  end_ts LONG)
+-- Value for the percentile.
+RETURNS DOUBLE AS
+SELECT value
+FROM counter_percentiles_for_time_range($counter_track_id, $start_ts, $end_ts)
+WHERE percentile = $percentile;
+
+-- Value for specific percentile (range 1-100) for counter track ID.
+CREATE PERFETTO FUNCTION counter_track_percentile(
+  -- Id of the counter track.
+  counter_track_id INT,
+  -- Any of the numbers from 1 to 100.
+  percentile INT)
+-- Value for the percentile.
+RETURNS DOUBLE AS
+SELECT counter_track_percentile_for_time($counter_track_id,
+                                         $percentile,
+                                         trace_start(),
+                                         trace_end());
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql
new file mode 100644
index 0000000..05b6b21
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql
@@ -0,0 +1,133 @@
+--
+-- Copyright 2022 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT 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 PERFETTO MODULE slices.with_context;
+
+-- Checks if slice has an ancestor with provided name.
+CREATE PERFETTO FUNCTION has_parent_slice_with_name(
+  -- Id of the slice to check parents of.
+  id INT,
+  -- Name of potential ancestor slice.
+  parent_name STRING)
+-- Whether `parent_name` is a name of an ancestor slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+  SELECT 1
+  FROM ancestor_slice($id)
+  WHERE name = $parent_name
+  LIMIT 1
+);
+
+-- Checks if slice has a descendant with provided name.
+CREATE PERFETTO FUNCTION has_descendant_slice_with_name(
+  -- Id of the slice to check descendants of.
+  id INT,
+  -- Name of potential descendant slice.
+  descendant_name STRING
+)
+-- Whether `descendant_name` is a name of an descendant slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+  SELECT 1
+  FROM descendant_slice($id)
+  WHERE name = $descendant_name
+  LIMIT 1
+);
+
+-- Finds the end timestamp for a given slice's descendant with a given name.
+-- If there are multiple descendants with a given name, the function will return the
+-- first one, so it's most useful when working with a timeline broken down into phases,
+-- where each subphase can happen only once.
+CREATE PERFETTO FUNCTION descendant_slice_end(
+  -- Id of the parent slice.
+  parent_id INT,
+  -- Name of the child with the desired end TS.
+  child_name STRING
+)
+-- End timestamp of the child or NULL if it doesn't exist.
+RETURNS INT AS
+SELECT
+  CASE WHEN s.dur
+    IS NOT -1 THEN s.ts + s.dur
+    ELSE NULL
+  END
+FROM descendant_slice($parent_id) s
+WHERE s.name = $child_name
+LIMIT 1;
+
+-- Finds all slices with a direct parent with the given parent_id.
+CREATE PERFETTO FUNCTION direct_children_slice(
+  -- Id of the parent slice.
+  parent_id LONG)
+RETURNS TABLE(
+  -- Alias for `slice.id`.
+  id LONG,
+  -- Alias for `slice.type`.
+  type STRING,
+  -- Alias for `slice.ts`.
+  ts LONG,
+  -- Alias for `slice.dur`.
+  dur LONG,
+  -- Alias for `slice.category`.
+  category LONG,
+  -- Alias for `slice.name`.
+  name STRING,
+  -- Alias for `slice.track_id`.
+  track_id LONG,
+  -- Alias for `slice.depth`.
+  depth LONG,
+  -- Alias for `slice.parent_id`.
+  parent_id LONG,
+  -- Alias for `slice.arg_set_id`.
+  arg_set_id LONG,
+  -- Alias for `slice.thread_ts`.
+  thread_ts LONG,
+  -- Alias for `slice.thread_dur`.
+  thread_dur LONG
+) AS
+SELECT
+  slice.id,
+  slice.type,
+  slice.ts,
+  slice.dur,
+  slice.category,
+  slice.name,
+  slice.track_id,
+  slice.depth,
+  slice.parent_id,
+  slice.arg_set_id,
+  slice.thread_ts,
+  slice.thread_dur
+FROM slice
+WHERE parent_id = $parent_id;
+
+-- Given a slice id, returns the name of the slice.
+CREATE PERFETTO FUNCTION slice_name_from_id(
+  -- The slice id which we need the name for.
+  id LONG
+)
+-- The name of slice with the given id.
+RETURNS STRING AS
+SELECT
+  name
+FROM slice
+WHERE $id = id;
+
+CREATE PERFETTO FUNCTION slice_count(
+  -- Name of the slices to counted.
+  slice_glob STRING)
+-- Number of slices with the name.
+RETURNS INT AS
+SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/thread_states.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/thread_states.sql
new file mode 100644
index 0000000..a0c63e9
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/thread_states.sql
@@ -0,0 +1,119 @@
+--
+-- Copyright 2022 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT 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 PERFETTO MODULE deprecated.v42.common.timestamps;
+INCLUDE PERFETTO MODULE deprecated.v42.common.cpus;
+
+-- TODO(altimin): this doesn't handle some corner cases which thread_state.ts
+-- handles (as complex strings manipulations in SQL are pretty painful),
+-- but they are pretty niche.
+-- Translates the thread state name from a single-letter shorthard to
+-- a human-readable name.
+CREATE PERFETTO FUNCTION _translate_thread_state_name(name STRING)
+RETURNS STRING AS
+SELECT CASE $name
+WHEN 'Running' THEN 'Running'
+WHEN 'R' THEN 'Runnable'
+WHEN 'R+' THEN 'Runnable (Preempted)'
+WHEN 'S' THEN 'Sleeping'
+WHEN 'D' THEN 'Uninterruptible Sleep'
+WHEN 'T' THEN 'Stopped'
+WHEN 't' THEN 'Traced'
+WHEN 'X' THEN 'Exit (Dead)'
+WHEN 'Z' THEN 'Exit (Zombie)'
+WHEN 'x' THEN 'Task Dead'
+WHEN 'I' THEN 'Idle'
+WHEN 'K' THEN 'Wakekill'
+WHEN 'W' THEN 'Waking'
+WHEN 'P' THEN 'Parked'
+WHEN 'N' THEN 'No Load'
+ELSE $name
+END;
+
+-- Returns a human-readable name for a thread state.
+CREATE PERFETTO FUNCTION human_readable_thread_state_name(
+  -- Thread state id.
+  id INT)
+-- Human-readable name for the thread state.
+RETURNS STRING AS
+WITH data AS (
+  SELECT
+    _translate_thread_state_name(state) AS state,
+    (CASE io_wait
+      WHEN 1 THEN ' (IO)'
+      WHEN 0 THEN ' (non-IO)'
+      ELSE ''
+    END) AS io_wait
+  FROM thread_state
+  WHERE id = $id
+)
+SELECT
+  printf('%s%s', state, io_wait)
+FROM data;
+
+-- Returns an aggregation of thread states (by state and cpu) for a given
+-- interval of time for a given thread.
+CREATE PERFETTO FUNCTION thread_state_summary_for_interval(
+  -- The start of the interval.
+  ts INT,
+  -- The duration of the interval.
+  dur INT,
+  -- The utid of the thread.
+  utid INT)
+RETURNS TABLE(
+  -- Human-readable thread state name.
+  state STRING,
+  -- Raw thread state name, alias of `thread_state.state`.
+  raw_state STRING,
+  -- The type of CPU if available (e.g. "big" / "mid" / "little").
+  cpu_type STRING,
+  -- The CPU index.
+  cpu INT,
+  -- The name of the kernel function execution is blocked in.
+  blocked_function STRING,
+  -- The total duration.
+  dur INT
+) AS
+WITH
+states_starting_inside AS (
+  SELECT id
+  FROM thread_state
+  WHERE $ts <= ts
+    AND ts <= $ts + $dur
+    AND utid = $utid
+),
+first_state_starting_before AS (
+  SELECT id
+  FROM thread_state
+  WHERE ts < $ts AND utid = $utid
+  ORDER BY ts DESC
+  LIMIT 1
+),
+relevant_states AS (
+  SELECT * FROM states_starting_inside
+  UNION ALL
+  SELECT * FROM first_state_starting_before
+)
+SELECT
+  human_readable_thread_state_name(id) as state,
+  state as raw_state,
+  guess_cpu_size(cpu) as cpu_type,
+  cpu,
+  blocked_function,
+  sum(spans_overlapping_dur($ts, $dur, ts, dur)) as dur
+FROM thread_state
+JOIN relevant_states USING (id)
+GROUP BY state, raw_state, cpu_type, cpu, blocked_function
+ORDER BY dur desc;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/timestamps.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/timestamps.sql
new file mode 100644
index 0000000..bff333f
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/timestamps.sql
@@ -0,0 +1,72 @@
+--
+-- Copyright 2022 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT 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 PERFETTO MODULE time.conversion;
+
+CREATE PERFETTO FUNCTION is_spans_overlapping(
+  ts1 LONG,
+  ts_end1 LONG,
+  ts2 LONG,
+  ts_end2 LONG)
+RETURNS BOOL AS
+SELECT (IIF($ts1 < $ts2, $ts2, $ts1)
+      < IIF($ts_end1 < $ts_end2, $ts_end1, $ts_end2));
+
+CREATE PERFETTO FUNCTION spans_overlapping_dur(
+  ts1 LONG,
+  dur1 LONG,
+  ts2 LONG,
+  dur2 LONG
+)
+RETURNS INT AS
+SELECT
+  CASE
+    WHEN $dur1 = -1 OR $dur2 = -1 THEN 0
+    WHEN $ts1 + $dur1 < $ts2 OR $ts2 + $dur2 < $ts1 THEN 0
+    WHEN ($ts1 >= $ts2) AND ($ts1 + $dur1 <= $ts2 + $dur2) THEN $dur1
+    WHEN ($ts1 < $ts2) AND ($ts1 + $dur1 < $ts2 + $dur2) THEN $ts1 + $dur1 - $ts2
+    WHEN ($ts1 > $ts2) AND ($ts1 + $dur1 > $ts2 + $dur2) THEN $ts2 + $dur2 - $ts1
+    ELSE $dur2
+  END;
+
+-- Renames
+
+CREATE PERFETTO FUNCTION ns(nanos INT)
+RETURNS INT AS
+SELECT time_from_ns($nanos);
+
+CREATE PERFETTO FUNCTION us(micros INT)
+RETURNS INT AS
+SELECT time_from_us($micros);
+
+CREATE PERFETTO FUNCTION ms(millis INT)
+RETURNS INT AS
+SELECT time_from_ms($millis);
+
+CREATE PERFETTO FUNCTION seconds(seconds INT)
+RETURNS INT AS
+SELECT time_from_s($seconds);
+
+CREATE PERFETTO FUNCTION minutes(minutes INT)
+RETURNS INT AS
+SELECT time_from_min($minutes);
+
+CREATE PERFETTO FUNCTION hours(hours INT)
+RETURNS INT AS
+SELECT time_from_hours($hours);
+
+CREATE PERFETTO FUNCTION days(days INT)
+RETURNS INT AS
+SELECT time_from_days($days);
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn
index 19162d5..03f9cd1 100644
--- a/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn
@@ -15,5 +15,8 @@
 import("../../../../../gn/perfetto_sql.gni")
 
 perfetto_sql_source_set("prelude") {
-  sources = [ "slices.sql" ]
+  sources = [
+    "slices.sql",
+    "trace_bounds.sql",
+  ]
 }
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql b/src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql
new file mode 100644
index 0000000..51db48d
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql
@@ -0,0 +1,40 @@
+--
+-- Copyright 2023 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- Definition of `trace_bounds` table. The values are being filled by Trace
+-- Processor when parsing the trace. Can't be a Perfetto table because it has
+-- to be mutable. 
+-- It is recommended to depend on the `trace_start()` and `trace_end()`
+-- functions rather than directly on `trace_bounds`.
+CREATE TABLE trace_bounds AS
+SELECT 0 AS start_ts, 0 AS end_ts;
+
+-- Fetch start of the trace.
+CREATE PERFETTO FUNCTION trace_start()
+-- Start of the trace in nanoseconds.
+RETURNS LONG AS
+SELECT start_ts FROM trace_bounds;
+
+-- Fetch end of the trace.
+CREATE PERFETTO FUNCTION trace_end()
+-- End of the trace in nanoseconds.
+RETURNS LONG AS
+SELECT end_ts FROM trace_bounds;
+
+-- Fetch duration of the trace.
+CREATE PERFETTO FUNCTION trace_dur()
+-- Duration of the trace in nanoseconds.
+RETURNS LONG AS
+SELECT trace_end() - trace_start();
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql b/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
index 8e74d2f..19f68c2 100644
--- a/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
@@ -14,7 +14,6 @@
 -- limitations under the License.
 --
 
-INCLUDE PERFETTO MODULE common.slices;
 INCLUDE PERFETTO MODULE slices.flat_slices;
 
 -- A 'thread_executing_span' is thread_state span starting with a runnable slice
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
index ac79369..2e5f02f 100644
--- a/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
@@ -18,5 +18,6 @@
   sources = [
     "flat_slices.sql",
     "slices.sql",
+    "with_context.sql",
   ]
 }
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql b/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
index 20383b3..9b08700 100644
--- a/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
@@ -13,8 +13,6 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 
-INCLUDE PERFETTO MODULE common.slices;
-
 -- All slices with related process and thread info if available. Unlike
 -- `thread_slice` and `process_slice`, this view contains all slices,
 -- with thread- and process-related columns set to NULL if the slice
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql b/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql
new file mode 100644
index 0000000..6e9ba0d
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql
@@ -0,0 +1,138 @@
+--
+-- Copyright 2024 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+-- All thread slices with data about thread, thread track and process.
+-- Where possible, use available view functions which filter this view.
+CREATE PERFETTO VIEW thread_slice(
+  -- Alias for `slice.id`.
+  id INT,
+  -- Alias for `slice.type`.
+  type STRING,
+  -- Alias for `slice.ts`.
+  ts INT,
+  -- Alias for `slice.dur`.
+  dur INT,
+  -- Alias for `slice.category`.
+  category STRING,
+  -- Alias for `slice.name`.
+  name STRING,
+  -- Alias for `slice.track_id`.
+  track_id INT,
+  -- Alias for `thread_track.name`.
+  track_name STRING,
+  -- Alias for `thread.name`.
+  thread_name STRING,
+  -- Alias for `thread.utid`.
+  utid INT,
+  -- Alias for `thread.tid`
+  tid INT,
+  -- Alias for `process.name`.
+  process_name STRING,
+  -- Alias for `process.upid`.
+  upid INT,
+  -- Alias for `process.pid`.
+  pid INT,
+  -- Alias for `slice.depth`.
+  depth INT,
+  -- Alias for `slice.parent_id`.
+  parent_id INT,
+  -- Alias for `slice.arg_set_id`.
+  arg_set_id INT,
+  -- Alias for `slice.thread_ts`.
+  thread_ts INT,
+  -- Alias for `slice.thread_dur`.
+  thread_dur INT
+) AS
+SELECT
+  slice.id,
+  slice.type,
+  slice.ts,
+  slice.dur,
+  slice.category,
+  slice.name,
+  slice.track_id,
+  thread_track.name AS track_name,
+  thread.name AS thread_name,
+  thread.utid,
+  thread.tid,
+  process.name AS process_name,
+  process.upid,
+  process.pid,
+  slice.depth,
+  slice.parent_id,
+  slice.arg_set_id,
+  slice.thread_ts,
+  slice.thread_dur
+FROM slice
+JOIN thread_track ON slice.track_id = thread_track.id
+JOIN thread USING (utid)
+LEFT JOIN process USING (upid);
+
+-- All process slices with data about process track and process.
+-- Where possible, use available view functions which filter this view.
+CREATE PERFETTO VIEW process_slice(
+  -- Alias for `slice.id`.
+  id INT,
+  -- Alias for `slice.type`.
+  type STRING,
+  -- Alias for `slice.ts`.
+  ts INT,
+  -- Alias for `slice.dur`.
+  dur INT,
+  -- Alias for `slice.category`.
+  category STRING,
+  -- Alias for `slice.name`.
+  name STRING,
+  -- Alias for `slice.track_id`.
+  track_id INT,
+  -- Alias for `process_track.name`.
+  track_name STRING,
+  -- Alias for `process.name`.
+  process_name STRING,
+  -- Alias for `process.upid`.
+  upid INT,
+  -- Alias for `process.pid`.
+  pid INT,
+  -- Alias for `slice.depth`.
+  depth INT,
+  -- Alias for `slice.parent_id`.
+  parent_id INT,
+  -- Alias for `slice.arg_set_id`.
+  arg_set_id INT,
+  -- Alias for `slice.thread_ts`.
+  thread_ts INT,
+  -- Alias for `slice.thread_dur`.
+  thread_dur INT
+) AS
+SELECT
+  slice.id,
+  slice.type,
+  slice.ts,
+  slice.dur,
+  slice.category,
+  slice.name,
+  slice.track_id,
+  process_track.name AS track_name,
+  process.name AS process_name,
+  process.upid,
+  process.pid,
+  slice.depth,
+  slice.parent_id,
+  slice.arg_set_id,
+  slice.thread_ts,
+  slice.thread_dur
+FROM slice
+JOIN process_track ON slice.track_id = process_track.id
+JOIN process USING (upid);
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/time/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/time/BUILD.gn
new file mode 100644
index 0000000..da92871
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/time/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright (C) 2022 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.
+
+import("../../../../../gn/perfetto_sql.gni")
+
+perfetto_sql_source_set("time") {
+  sources = [ "conversion.sql" ]
+}
diff --git a/src/trace_processor/perfetto_sql/stdlib/time/conversion.sql b/src/trace_processor/perfetto_sql/stdlib/time/conversion.sql
new file mode 100644
index 0000000..9a284d0
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/time/conversion.sql
@@ -0,0 +1,85 @@
+--
+-- Copyright 2024 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
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT 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 the provided nanosecond duration, which is the default
+-- representation of time durations in trace processor. Provided for
+-- consistency with other functions.
+CREATE PERFETTO FUNCTION time_from_ns(
+  -- Time duration in nanoseconds.
+  nanos INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $nanos;
+
+-- Converts a duration in microseconds to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_us(
+  -- Time duration in microseconds.
+  micros INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $micros * 1000;
+
+-- Converts a duration in millseconds to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_ms(
+  -- Time duration in milliseconds.
+  millis INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $millis * 1000 * 1000;
+
+-- Converts a duration in seconds to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_s(
+  -- Time duration in seconds.
+  seconds INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $seconds * 1000 * 1000 * 1000;
+
+-- Converts a duration in minutes to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_min(
+  -- Time duration in minutes.
+  minutes INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $minutes * 60 * 1000 * 1000 * 1000;
+
+-- Converts a duration in hours to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_hours(
+  -- Time duration in hours.
+  hours INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $hours * 60 * 60 * 1000 * 1000 * 1000;
+
+-- Converts a duration in days to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_days(
+  -- Time duration in days.
+  days INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $days * 24 * 60 * 60 * 1000 * 1000 * 1000;
diff --git a/src/trace_processor/sqlite/db_sqlite_table.cc b/src/trace_processor/sqlite/db_sqlite_table.cc
index 0f416b1..8131d36 100644
--- a/src/trace_processor/sqlite/db_sqlite_table.cc
+++ b/src/trace_processor/sqlite/db_sqlite_table.cc
@@ -46,9 +46,9 @@
 #include "src/trace_processor/sqlite/sqlite_utils.h"
 #include "src/trace_processor/tp_metatrace.h"
 #include "src/trace_processor/util/regex.h"
+#include "src/trace_processor/util/status_macros.h"
 
 #include "protos/perfetto/trace_processor/metatrace_categories.pbzero.h"
-#include "src/trace_processor/util/status_macros.h"
 
 namespace perfetto::trace_processor {
 
@@ -116,6 +116,8 @@
     case SQLITE_NULL:
       value.type = SqlValue::kNull;
       break;
+    default:
+      PERFETTO_FATAL("Unexpected sqlite3_value type");
   }
   return value;
 }
@@ -405,10 +407,11 @@
     if (!col.is_hidden) {
       continue;
     }
-    auto it = std::find_if(qc.constraints().begin(), qc.constraints().end(),
-                           [i](const QueryConstraints::Constraint& c) {
-                             return i == static_cast<uint32_t>(c.column);
-                           });
+    auto pred = [i](const QueryConstraints::Constraint& c) {
+      return i == static_cast<uint32_t>(c.column);
+    };
+    auto it =
+        std::find_if(qc.constraints().begin(), qc.constraints().end(), pred);
     if (it == qc.constraints().end()) {
       return base::ErrStatus("Failed to find constraint on column '%u'", i);
     }
@@ -416,12 +419,8 @@
       return base::ErrStatus(
           "Only equality constraints supported on column '%u'", i);
     }
-    auto count = std::count_if(qc.constraints().begin(), qc.constraints().end(),
-                               [i](const QueryConstraints::Constraint& c) {
-                                 return i == static_cast<uint32_t>(c.column);
-                               });
-    PERFETTO_CHECK(count > 0);
-    if (count > 1) {
+    auto count = std::count_if(it + 1, qc.constraints().end(), pred);
+    if (count > 0) {
       return base::ErrStatus("Found multiple constraints on column '%u'", i);
     }
   }
@@ -429,7 +428,7 @@
 }
 
 std::unique_ptr<SqliteTable::BaseCursor> DbSqliteTable::CreateCursor() {
-  return std::unique_ptr<Cursor>(new Cursor(this, context_->cache));
+  return std::make_unique<Cursor>(this, context_->cache);
 }
 
 DbSqliteTable::Cursor::Cursor(DbSqliteTable* sqlite_table, QueryCache* cache)
@@ -502,7 +501,7 @@
   uint32_t constraints_pos = 0;
   for (size_t i = 0; i < qc.constraints().size(); ++i) {
     const auto& cs = qc.constraints()[i];
-    uint32_t col = static_cast<uint32_t>(cs.column);
+    auto col = static_cast<uint32_t>(cs.column);
 
     // If we get a std::nullopt FilterOp, that means we should allow SQLite
     // to handle the constraint.
@@ -529,7 +528,7 @@
   orders_.resize(qc.order_by().size());
   for (size_t i = 0; i < qc.order_by().size(); ++i) {
     const auto& ob = qc.order_by()[i];
-    uint32_t col = static_cast<uint32_t>(ob.iColumn);
+    auto col = static_cast<uint32_t>(ob.iColumn);
     orders_[i] = Order{col, static_cast<bool>(ob.desc)};
   }
 
@@ -678,36 +677,6 @@
   return base::OkStatus();
 }
 
-base::Status DbSqliteTable::Cursor::Next() {
-  if (mode_ == Mode::kSingleRow) {
-    eof_ = true;
-  } else {
-    eof_ = !++*iterator_;
-  }
-  return base::OkStatus();
-}
-
-bool DbSqliteTable::Cursor::Eof() {
-  return eof_;
-}
-
-base::Status DbSqliteTable::Cursor::Column(sqlite3_context* ctx, int raw_col) {
-  auto column = static_cast<uint32_t>(raw_col);
-  SqlValue value = mode_ == Mode::kSingleRow
-                       ? SourceTable()->columns()[column].Get(*single_row_)
-                       : iterator_->Get(column);
-  // We can say kSqliteStatic for strings  because all strings are expected to
-  // come from the string pool and thus will be valid for the lifetime
-  // of trace processor.
-  // Similarily for bytes we can also use kSqliteStatic because for our iterator
-  // will hold onto the pointer as long as we don't call Next() but that only
-  // happens with Next() is called on the Cursor itself at which point
-  // SQLite no longer cares about the bytes pointer.
-  sqlite_utils::ReportSqlValue(ctx, value, sqlite_utils::kSqliteStatic,
-                               sqlite_utils::kSqliteStatic);
-  return base::OkStatus();
-}
-
 base::Status DbSqliteTable::Cursor::ExtractTableFunctionArguments(
     const Table::Schema& schema,
     std::vector<Constraint>& constraints,
diff --git a/src/trace_processor/sqlite/db_sqlite_table.h b/src/trace_processor/sqlite/db_sqlite_table.h
index 74ce2e0..5f4a3d7 100644
--- a/src/trace_processor/sqlite/db_sqlite_table.h
+++ b/src/trace_processor/sqlite/db_sqlite_table.h
@@ -26,6 +26,7 @@
 
 #include <sqlite3.h>
 
+#include "perfetto/base/compiler.h"
 #include "perfetto/base/status.h"
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/db/column/types.h"
@@ -35,6 +36,7 @@
 #include "src/trace_processor/sqlite/query_cache.h"
 #include "src/trace_processor/sqlite/query_constraints.h"
 #include "src/trace_processor/sqlite/sqlite_table.h"
+#include "src/trace_processor/sqlite/sqlite_utils.h"
 
 namespace perfetto {
 namespace trace_processor {
@@ -97,9 +99,33 @@
     base::Status Filter(const QueryConstraints& qc,
                         sqlite3_value** argv,
                         FilterHistory);
-    base::Status Next();
-    bool Eof();
-    base::Status Column(sqlite3_context*, int N);
+
+    PERFETTO_ALWAYS_INLINE void Next() {
+      if (mode_ == Mode::kSingleRow) {
+        eof_ = true;
+      } else {
+        eof_ = !++*iterator_;
+      }
+    }
+
+    PERFETTO_ALWAYS_INLINE bool Eof() const { return eof_; }
+
+    PERFETTO_ALWAYS_INLINE void Column(sqlite3_context* ctx,
+                                       int raw_col) const {
+      auto column = static_cast<uint32_t>(raw_col);
+      SqlValue value = mode_ == Mode::kSingleRow
+                           ? SourceTable()->columns()[column].Get(*single_row_)
+                           : iterator_->Get(column);
+      // We can say kSqliteStatic for strings because all strings are expected
+      // to come from the string pool. Thus they will be valid for the lifetime
+      // of trace processor. Similarily, for bytes, we can also use
+      // kSqliteStatic because for our iterator will hold onto the pointer as
+      // long as we don't call Next(). However, that only happens when Next() is
+      // called on the Cursor itself, at which point SQLite no longer cares
+      // about the bytes pointer.
+      sqlite_utils::ReportSqlValue(ctx, value, sqlite_utils::kSqliteStatic,
+                                   sqlite_utils::kSqliteStatic);
+    }
 
    private:
     enum class Mode {
diff --git a/src/trace_processor/sqlite/sqlite_table.h b/src/trace_processor/sqlite/sqlite_table.h
index d6d40b3..b2a7e40 100644
--- a/src/trace_processor/sqlite/sqlite_table.h
+++ b/src/trace_processor/sqlite/sqlite_table.h
@@ -18,24 +18,16 @@
 #define SRC_TRACE_PROCESSOR_SQLITE_SQLITE_TABLE_H_
 
 #include <sqlite3.h>
-
-#include <functional>
-#include <limits>
 #include <memory>
-#include <optional>
 #include <string>
+#include <type_traits>
 #include <vector>
 
 #include "perfetto/base/status.h"
-#include "perfetto/ext/base/flat_hash_map.h"
-#include "perfetto/ext/base/status_or.h"
-#include "perfetto/ext/base/utils.h"
 #include "perfetto/trace_processor/basic_types.h"
-#include "src/trace_processor/db/table.h"
 #include "src/trace_processor/sqlite/query_constraints.h"
 
-namespace perfetto {
-namespace trace_processor {
+namespace perfetto::trace_processor {
 
 class SqliteEngine;
 class TypedSqliteTableBase;
@@ -104,14 +96,14 @@
                         FilterHistory);
 
     // Called to forward the cursor to the next row in the table.
-    base::Status Next();
+    void Next();
 
     // Called to check if the cursor has reached eof. Column will be called iff
     // this method returns true.
     bool Eof();
 
     // Used to extract the value from the column at index |N|.
-    base::Status Column(sqlite3_context* context, int N);
+    void Column(sqlite3_context* context, int N);
 
     SqliteTable* table() const { return table_; }
 
@@ -397,16 +389,33 @@
   }
   static int xNext(sqlite3_vtab_cursor* c) {
     auto* cursor = static_cast<typename SubTable::Cursor*>(c);
-    auto* table = static_cast<SubTable*>(cursor->table());
-    return table->SetStatusAndReturn(cursor->Next());
+    using NextType = decltype(&SubTable::Cursor::Next);
+    using ReturnType =
+        std::invoke_result_t<NextType, typename SubTable::Cursor*>;
+    if constexpr (std::is_same_v<ReturnType, void>) {
+      cursor->Next();
+      return SQLITE_OK;
+    } else {
+      auto* table = static_cast<SubTable*>(cursor->table());
+      return table->SetStatusAndReturn(cursor->Next());
+    }
   }
   static int xEof(sqlite3_vtab_cursor* c) {
     return static_cast<int>(static_cast<typename SubTable::Cursor*>(c)->Eof());
   }
   static int xColumn(sqlite3_vtab_cursor* c, sqlite3_context* a, int b) {
     auto* cursor = static_cast<typename SubTable::Cursor*>(c);
-    auto* table = static_cast<SubTable*>(cursor->table());
-    return table->SetStatusAndReturn(cursor->Column(a, b));
+    using ColumnType = decltype(&SubTable::Cursor::Column);
+    using ReturnType =
+        std::invoke_result_t<ColumnType, typename SubTable::Cursor*,
+                             sqlite3_context*, int>;
+    if constexpr (std::is_same_v<ReturnType, void>) {
+      cursor->Column(a, b);
+      return SQLITE_OK;
+    } else {
+      auto* table = static_cast<SubTable*>(cursor->table());
+      return table->SetStatusAndReturn(cursor->Column(a, b));
+    }
   }
   static int xRowid(sqlite3_vtab_cursor*, sqlite3_int64*) {
     return SQLITE_ERROR;
@@ -420,7 +429,6 @@
   }
 };
 
-}  // namespace trace_processor
-}  // namespace perfetto
+}  // namespace perfetto::trace_processor
 
 #endif  // SRC_TRACE_PROCESSOR_SQLITE_SQLITE_TABLE_H_
diff --git a/src/trace_processor/storage/stats.h b/src/trace_processor/storage/stats.h
index 70d5a1c..66a524e 100644
--- a/src/trace_processor/storage/stats.h
+++ b/src/trace_processor/storage/stats.h
@@ -60,12 +60,15 @@
   F(ftrace_cpu_oldest_event_ts_end,       kIndexed, kInfo,     kTrace,    ""), \
   F(ftrace_cpu_overrun_begin,             kIndexed, kInfo,     kTrace,    ""), \
   F(ftrace_cpu_overrun_end,               kIndexed, kInfo,     kTrace,    ""), \
-  F(ftrace_cpu_overrun_delta,             kIndexed, kDataLoss, kTrace,         \
-       "The kernel ftrace buffer cannot keep up with the rate of events "      \
-       "produced. Indexed by CPU. This is likely a misconfiguration."),        \
+  F(ftrace_cpu_overrun_delta,             kIndexed, kInfo,     kTrace,    ""), \
   F(ftrace_cpu_read_events_begin,         kIndexed, kInfo,     kTrace,    ""), \
   F(ftrace_cpu_read_events_end,           kIndexed, kInfo,     kTrace,    ""), \
   F(ftrace_cpu_read_events_delta,         kIndexed, kInfo,     kTrace,    ""), \
+  F(ftrace_cpu_has_data_loss,             kIndexed, kDataLoss, kTrace,         \
+       "Ftrace data for the given cpu has data losses and is therefore "       \
+       "unreliable. The kernel buffer overwrote events between our reads "     \
+       "in userspace. Try re-recording the trace with a bigger buffer "        \
+       "(ftrace_config.buffer_size_kb), or with fewer enabled ftrace events."),\
   F(ftrace_setup_errors,                  kSingle,  kInfo,     kTrace,         \
        "One or more atrace/ftrace categories were not found or failed to "     \
        "enable. See ftrace_setup_errors in the metadata table for details."),  \
@@ -112,8 +115,6 @@
   F(flow_end_without_start,               kSingle,  kInfo,     kTrace,    ""), \
   F(flow_invalid_id,                      kSingle,  kError,    kTrace,    ""), \
   F(flow_without_direction,               kSingle,  kError,    kTrace,    ""), \
-  F(stackprofile_empty_callstack,         kSingle,  kError,    kTrace,         \
-      "Callstack had no frames. Ignored"),                                     \
   F(stackprofile_invalid_string_id,       kSingle,  kError,    kTrace,    ""), \
   F(stackprofile_invalid_mapping_id,      kSingle,  kError,    kTrace,    ""), \
   F(stackprofile_invalid_frame_id,        kSingle,  kError,    kTrace,    ""), \
@@ -140,7 +141,11 @@
                                           kIndexed, kInfo,     kTrace,    ""), \
   F(traced_buf_padding_bytes_cleared,     kIndexed, kInfo,     kTrace,    ""), \
   F(traced_buf_padding_bytes_written,     kIndexed, kInfo,     kTrace,    ""), \
-  F(traced_buf_patches_failed,            kIndexed, kDataLoss, kTrace,    ""), \
+  F(traced_buf_patches_failed,            kIndexed, kDataLoss, kTrace,         \
+      "The tracing service potentially lost data from one of the data sources "\
+      "writing into the given target_buffer. This entry can be ignored"        \
+      "if you're using DISCARD buffers and traced_buf_chunks_discarded is      \
+      nonzero, meaning that the buffer was filled."),                          \
   F(traced_buf_patches_succeeded,         kIndexed, kInfo,     kTrace,    ""), \
   F(traced_buf_readaheads_failed,         kIndexed, kInfo,     kTrace,    ""), \
   F(traced_buf_readaheads_succeeded,      kIndexed, kInfo,     kTrace,    ""), \
diff --git a/src/trace_processor/tables/BUILD.gn b/src/trace_processor/tables/BUILD.gn
index 40f5fe1..b2fcffb 100644
--- a/src/trace_processor/tables/BUILD.gn
+++ b/src/trace_processor/tables/BUILD.gn
@@ -41,8 +41,9 @@
   deps = [
     "../../../gn:default_deps",
     "../../../include/perfetto/ext/base",
+    "../../../include/perfetto/trace_processor",
     "../containers",
-    "../db",
+    "../db:minimal",
     "../db/column",
   ]
   public_deps = [ ":tables_python" ]
diff --git a/src/trace_processor/tables/macros_internal.h b/src/trace_processor/tables/macros_internal.h
index ff83d20..94293e7 100644
--- a/src/trace_processor/tables/macros_internal.h
+++ b/src/trace_processor/tables/macros_internal.h
@@ -19,22 +19,25 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <initializer_list>
 #include <type_traits>
 #include <utility>
 #include <vector>
 
+#include "perfetto/base/compiler.h"
 #include "perfetto/base/logging.h"
+#include "perfetto/trace_processor/ref_counted.h"
 #include "src/trace_processor/containers/bit_vector.h"
 #include "src/trace_processor/containers/row_map.h"
 #include "src/trace_processor/containers/string_pool.h"
 #include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/selector_overlay.h"
 #include "src/trace_processor/db/column_storage.h"
 #include "src/trace_processor/db/column_storage_overlay.h"
 #include "src/trace_processor/db/table.h"
 
-namespace perfetto {
-namespace trace_processor {
-namespace macros_internal {
+namespace perfetto::trace_processor::macros_internal {
 
 // We define this class to allow the table macro below to compile without
 // needing templates; in reality none of the methods will be called because the
@@ -81,9 +84,9 @@
 
  protected:
   // Constructors for tables created by the regular constructor.
-  explicit MacroTable(StringPool* pool,
-                      std::vector<ColumnLegacy> columns,
-                      const MacroTable* parent = nullptr)
+  PERFETTO_NO_INLINE explicit MacroTable(StringPool* pool,
+                                         std::vector<ColumnLegacy> columns,
+                                         const MacroTable* parent)
       : Table(pool, 0u, std::move(columns), EmptyOverlaysFromParent(parent)),
         allow_inserts_(true),
         parent_(parent) {}
@@ -97,21 +100,22 @@
               parent_overlay.size(),
               std::move(columns),
               SelectedOverlaysFromParent(parent, parent_overlay)),
-        allow_inserts_(false) {}
+        allow_inserts_(false),
+        parent_(&parent) {}
 
   ~MacroTable() override;
 
-  void UpdateOverlaysAfterParentInsert() {
+  PERFETTO_NO_INLINE void UpdateOverlaysAfterParentInsert() {
     CopyLastInsertFrom(parent_->overlays());
   }
 
-  void UpdateSelfOverlayAfterInsert() {
+  PERFETTO_NO_INLINE void UpdateSelfOverlayAfterInsert() {
     IncrementRowCountAndAddToLastOverlay();
   }
 
-  static std::vector<ColumnLegacy> CopyColumnsFromParentOrAddRootColumns(
-      MacroTable* self,
-      const MacroTable* parent) {
+  PERFETTO_NO_INLINE static std::vector<ColumnLegacy>
+  CopyColumnsFromParentOrAddRootColumns(MacroTable* self,
+                                        const MacroTable* parent) {
     std::vector<ColumnLegacy> columns;
     if (parent) {
       for (const ColumnLegacy& col : parent->columns()) {
@@ -124,6 +128,31 @@
     return columns;
   }
 
+  PERFETTO_NO_INLINE void OnConstructionCompletedRegularConstructor(
+      std::initializer_list<RefPtr<column::DataLayer>> storage_layers,
+      std::initializer_list<RefPtr<column::DataLayer>> null_layers) {
+    std::vector<RefPtr<column::DataLayer>> overlay_layers(
+        OverlayCount(parent_) + 1);
+    for (uint32_t i = 0; i < overlay_layers.size() - 1; ++i) {
+      PERFETTO_CHECK(overlays()[i].row_map().IsBitVector());
+      overlay_layers[i].reset(new column::SelectorOverlay(
+          overlays()[i].row_map().GetIfBitVector()));
+    }
+    Table::OnConstructionCompleted(storage_layers, null_layers,
+                                   std::move(overlay_layers));
+  }
+
+  template <typename T>
+  PERFETTO_NO_INLINE static void AddColumnToVector(
+      std::vector<ColumnLegacy>& columns,
+      const char* name,
+      ColumnStorage<T>* storage,
+      uint32_t flags,
+      uint32_t column_index,
+      uint32_t overlay_index) {
+    columns.emplace_back(name, storage, flags, column_index, overlay_index);
+  }
+
   static uint32_t OverlayCount(const MacroTable* parent) {
     return parent ? static_cast<uint32_t>(parent->overlays().size()) : 0;
   }
@@ -148,8 +177,8 @@
   ColumnStorage<StringPool::Id> type_;
 
  private:
-  static std::vector<ColumnStorageOverlay> EmptyOverlaysFromParent(
-      const MacroTable* parent) {
+  PERFETTO_NO_INLINE static std::vector<ColumnStorageOverlay>
+  EmptyOverlaysFromParent(const MacroTable* parent) {
     std::vector<ColumnStorageOverlay> overlays(
         parent ? parent->overlays().size() : 0);
     for (auto& overlay : overlays) {
@@ -158,9 +187,9 @@
     overlays.emplace_back();
     return overlays;
   }
-  static std::vector<ColumnStorageOverlay> SelectedOverlaysFromParent(
-      const macros_internal::MacroTable& parent,
-      const RowMap& rm) {
+  PERFETTO_NO_INLINE static std::vector<ColumnStorageOverlay>
+  SelectedOverlaysFromParent(const macros_internal::MacroTable& parent,
+                             const RowMap& rm) {
     std::vector<ColumnStorageOverlay> overlays;
     for (const auto& overlay : parent.overlays()) {
       overlays.emplace_back(overlay.SelectRows(rm));
@@ -266,8 +295,6 @@
   uint32_t row_number_ = 0;
 };
 
-}  // namespace macros_internal
-}  // namespace trace_processor
-}  // namespace perfetto
+}  // namespace perfetto::trace_processor::macros_internal
 
 #endif  // SRC_TRACE_PROCESSOR_TABLES_MACROS_INTERNAL_H_
diff --git a/src/trace_processor/trace_processor_context.cc b/src/trace_processor/trace_processor_context.cc
index c7cea38..34da487 100644
--- a/src/trace_processor/trace_processor_context.cc
+++ b/src/trace_processor/trace_processor_context.cc
@@ -31,12 +31,13 @@
 #include "src/trace_processor/importers/common/process_tracker.h"
 #include "src/trace_processor/importers/common/slice_tracker.h"
 #include "src/trace_processor/importers/common/slice_translation_table.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
 #include "src/trace_processor/importers/common/track_tracker.h"
 #include "src/trace_processor/importers/ftrace/ftrace_module.h"
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
 #include "src/trace_processor/importers/proto/perf_sample_tracker.h"
 #include "src/trace_processor/importers/proto/proto_importer_module.h"
 #include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
 #include "src/trace_processor/importers/proto/track_event_module.h"
 #include "src/trace_processor/sorter/trace_sorter.h"
 #include "src/trace_processor/types/destructible.h"
diff --git a/src/trace_processor/trace_processor_storage_impl.cc b/src/trace_processor/trace_processor_storage_impl.cc
index 05b88c0..f24a1fc 100644
--- a/src/trace_processor/trace_processor_storage_impl.cc
+++ b/src/trace_processor/trace_processor_storage_impl.cc
@@ -30,14 +30,15 @@
 #include "src/trace_processor/importers/common/process_tracker.h"
 #include "src/trace_processor/importers/common/slice_tracker.h"
 #include "src/trace_processor/importers/common/slice_translation_table.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
 #include "src/trace_processor/importers/common/track_tracker.h"
 #include "src/trace_processor/importers/proto/chrome_track_event.descriptor.h"
 #include "src/trace_processor/importers/proto/default_modules.h"
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
 #include "src/trace_processor/importers/proto/packet_analyzer.h"
 #include "src/trace_processor/importers/proto/perf_sample_tracker.h"
 #include "src/trace_processor/importers/proto/proto_importer_module.h"
 #include "src/trace_processor/importers/proto/proto_trace_reader.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
 #include "src/trace_processor/importers/proto/track_event.descriptor.h"
 #include "src/trace_processor/sorter/trace_sorter.h"
 #include "src/trace_processor/util/descriptors.h"
@@ -62,8 +63,9 @@
   context_.process_tracker.reset(new ProcessTracker(&context_));
   context_.clock_tracker.reset(new ClockTracker(&context_));
   context_.clock_converter.reset(new ClockConverter(&context_));
+  context_.heap_profile_tracker.reset(new HeapProfileTracker(&context_));
   context_.perf_sample_tracker.reset(new PerfSampleTracker(&context_));
-  context_.stack_profile_tracker.reset(new StackProfileTracker(&context_));
+  context_.global_stack_profile_tracker.reset(new GlobalStackProfileTracker());
   context_.metadata_tracker.reset(new MetadataTracker(context_.storage.get()));
   context_.global_args_tracker.reset(
       new GlobalArgsTracker(context_.storage.get()));
@@ -141,6 +143,7 @@
   }
   context_.event_tracker->FlushPendingEvents();
   context_.slice_tracker->FlushPendingSlices();
+  context_.heap_profile_tracker->NotifyEndOfFile();
   context_.args_tracker->Flush();
   context_.process_tracker->NotifyEndOfFile();
 }
diff --git a/src/trace_processor/types/trace_processor_context.h b/src/trace_processor/types/trace_processor_context.h
index ad4e148..25f129b 100644
--- a/src/trace_processor/types/trace_processor_context.h
+++ b/src/trace_processor/types/trace_processor_context.h
@@ -52,8 +52,9 @@
 class ForwardingTraceParser;
 class FtraceModule;
 class GlobalArgsTracker;
-class StackProfileTracker;
+class GlobalStackProfileTracker;
 class HeapGraphTracker;
+class HeapProfileTracker;
 class PerfSampleTracker;
 class MetadataTracker;
 class PacketAnalyzer;
@@ -100,8 +101,9 @@
   std::unique_ptr<EventTracker> event_tracker;
   std::unique_ptr<ClockTracker> clock_tracker;
   std::unique_ptr<ClockConverter> clock_converter;
+  std::unique_ptr<HeapProfileTracker> heap_profile_tracker;
   std::unique_ptr<PerfSampleTracker> perf_sample_tracker;
-  std::unique_ptr<StackProfileTracker> stack_profile_tracker;
+  std::unique_ptr<GlobalStackProfileTracker> global_stack_profile_tracker;
   std::unique_ptr<MetadataTracker> metadata_tracker;
 
   // These fields are stored as pointers to Destructible objects rather than
diff --git a/src/trace_processor/util/BUILD.gn b/src/trace_processor/util/BUILD.gn
index 23ff718..c717d3e 100644
--- a/src/trace_processor/util/BUILD.gn
+++ b/src/trace_processor/util/BUILD.gn
@@ -63,16 +63,12 @@
 
 source_set("stack_traces_util") {
   sources = [
-    "profiler_util.cc",
-    "profiler_util.h",
     "stack_traces_util.cc",
     "stack_traces_util.h",
   ]
   deps = [
     "../../../gn:default_deps",
     "../../../include/perfetto/ext/base:base",
-    "../../../protos/perfetto/trace/profiling:zero",
-    "../storage:storage",
   ]
 }
 
diff --git a/src/tracing/core/shared_memory_arbiter_impl.cc b/src/tracing/core/shared_memory_arbiter_impl.cc
index dfbb66b..d9d774e 100644
--- a/src/tracing/core/shared_memory_arbiter_impl.cc
+++ b/src/tracing/core/shared_memory_arbiter_impl.cc
@@ -93,10 +93,7 @@
 
 Chunk SharedMemoryArbiterImpl::GetNewChunk(
     const SharedMemoryABI::ChunkHeader& header,
-    BufferExhaustedPolicy buffer_exhausted_policy,
-    size_t size_hint) {
-  PERFETTO_DCHECK(size_hint == 0);  // Not implemented yet.
-
+    BufferExhaustedPolicy buffer_exhausted_policy) {
   int stall_count = 0;
   unsigned stall_interval_us = 0;
   bool task_runner_runs_on_current_thread = false;
diff --git a/src/tracing/core/shared_memory_arbiter_impl.h b/src/tracing/core/shared_memory_arbiter_impl.h
index 12316dd..9bb5cfd 100644
--- a/src/tracing/core/shared_memory_arbiter_impl.h
+++ b/src/tracing/core/shared_memory_arbiter_impl.h
@@ -130,8 +130,7 @@
   // BufferExhaustedPolicy, this may return an invalid chunk if no valid free
   // chunk could be found in the SMB.
   SharedMemoryABI::Chunk GetNewChunk(const SharedMemoryABI::ChunkHeader&,
-                                     BufferExhaustedPolicy,
-                                     size_t size_hint = 0);
+                                     BufferExhaustedPolicy);
 
   // Puts back a Chunk that has been completed and sends a request to the
   // service to move it to the central tracing buffer. |target_buffer| is the
diff --git a/src/tracing/service/tracing_service_impl.cc b/src/tracing/service/tracing_service_impl.cc
index 3b94cbf..aba6620 100644
--- a/src/tracing/service/tracing_service_impl.cc
+++ b/src/tracing/service/tracing_service_impl.cc
@@ -1797,7 +1797,7 @@
   }
 
   if (tracing_session->state != TracingSession::STARTED) {
-    PERFETTO_ELOG("Flush() called, but tracing has not been started");
+    PERFETTO_LOG("Flush() called, but tracing has not been started");
     callback(false);
     return;
   }
diff --git a/src/tracing/service/tracing_service_impl_unittest.cc b/src/tracing/service/tracing_service_impl_unittest.cc
index 76590b4..17936e5 100644
--- a/src/tracing/service/tracing_service_impl_unittest.cc
+++ b/src/tracing/service/tracing_service_impl_unittest.cc
@@ -5080,7 +5080,7 @@
 }
 
 TEST_F(TracingServiceImplTest, ClearBeforeClone) {
-  // The consumer the creates the initial tracing session.
+  // The consumer that creates the initial tracing session.
   std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
   consumer->Connect(svc.get());
 
@@ -5150,6 +5150,53 @@
                                                   HasSubstr("after_clone")))));
 }
 
+TEST_F(TracingServiceImplTest, CloneMainSessionStopped) {
+  // The consumer that creates the initial tracing session.
+  std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
+  consumer->Connect(svc.get());
+
+  std::unique_ptr<MockProducer> producer = CreateMockProducer();
+  producer->Connect(svc.get(), "mock_producer1");
+  producer->RegisterDataSource("ds_1");
+
+  TraceConfig trace_config;
+  trace_config.add_buffers()->set_size_kb(1024);  // Buf 0.
+  auto* ds_cfg = trace_config.add_data_sources()->mutable_config();
+  ds_cfg->set_name("ds_1");
+  ds_cfg->set_target_buffer(0);
+
+  consumer->EnableTracing(trace_config);
+  producer->WaitForTracingSetup();
+  producer->WaitForDataSourceSetup("ds_1");
+  producer->WaitForDataSourceStart("ds_1");
+
+  std::unique_ptr<TraceWriter> writer = producer->CreateTraceWriter("ds_1");
+  {
+    auto packet = writer->NewTracePacket();
+    packet->set_for_testing()->set_str("before_clone");
+  }
+  writer->Flush();
+
+  consumer->DisableTracing();
+  producer->WaitForDataSourceStop("ds_1");
+  consumer->WaitForTracingDisabled();
+
+  // The tracing session is disabled, but it's still there. We can still clone
+  // it.
+  std::unique_ptr<MockConsumer> clone_consumer = CreateMockConsumer();
+  clone_consumer->Connect(svc.get());
+
+  auto clone_done = task_runner.CreateCheckpoint("clone_done");
+  EXPECT_CALL(*clone_consumer, OnSessionCloned(_))
+      .WillOnce(InvokeWithoutArgs(clone_done));
+  clone_consumer->CloneSession(1);
+
+  auto packets = clone_consumer->ReadBuffers();
+  EXPECT_THAT(packets, Contains(Property(&protos::gen::TracePacket::for_testing,
+                                         Property(&protos::gen::TestEvent::str,
+                                                  HasSubstr("before_clone")))));
+}
+
 TEST_F(TracingServiceImplTest, CloneTransferFlush) {
   // The consumer the creates the initial tracing session.
   std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
diff --git a/test/data/freezer_trace.atr.sha256 b/test/data/freezer_trace.atr.sha256
new file mode 100644
index 0000000..bbe6a9b
--- /dev/null
+++ b/test/data/freezer_trace.atr.sha256
@@ -0,0 +1 @@
+abbffc92db09d1b7fd3452e9d5e91aebd5a13151660125c6e25776331efccc53
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256 b/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256
index 63cfe4c..590d1c0 100644
--- a/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256
+++ b/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256
@@ -1 +1 @@
-307a9fee76af1020dca1ad22b42c447c84fed3a4cf1321359d02aa6d41b9188f
\ No newline at end of file
+71f0799ce780f36dbdeb601ba535ee012b7323afc57254a5b383704ec384da62
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256 b/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256
index 4d6e72d..fd6b0fe 100644
--- a/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256
+++ b/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256
@@ -1 +1 @@
-c87f517ecbc37a6455d72f6cb337c001aa903754bd1cc36158268e193c6bac95
\ No newline at end of file
+725ff7289949bda82fc4c2d454e1ee0b4218b3d56f20c1098d6fa7914ef19bfc
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-chrome_missing_track_names_load.png.sha256 b/test/data/ui-screenshots/ui-chrome_missing_track_names_load.png.sha256
index d8f53e7..06a3e7b 100644
--- a/test/data/ui-screenshots/ui-chrome_missing_track_names_load.png.sha256
+++ b/test/data/ui-screenshots/ui-chrome_missing_track_names_load.png.sha256
@@ -1 +1 @@
-a4b1867255b838c3ab73f6d00c84aa5bd7fc31bb53da5b83f52ceb84d99e96b2
\ No newline at end of file
+22ca974ba2f262c4e421e95dba686746eb89564a8ff213e50f78c9424277587c
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-chrome_rendering_desktop_expand_browser_proc.png.sha256 b/test/data/ui-screenshots/ui-chrome_rendering_desktop_expand_browser_proc.png.sha256
index 6cbb409..a917bab 100644
--- a/test/data/ui-screenshots/ui-chrome_rendering_desktop_expand_browser_proc.png.sha256
+++ b/test/data/ui-screenshots/ui-chrome_rendering_desktop_expand_browser_proc.png.sha256
@@ -1 +1 @@
-ec9873453c3834735d55eb21138bf510069cf863342509a799076d821a8f01dd
\ No newline at end of file
+90505c5620c73940b88d163a73c79005fa8e81d097d0fcabf2585e56f7bc6a99
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-chrome_rendering_desktop_load.png.sha256 b/test/data/ui-screenshots/ui-chrome_rendering_desktop_load.png.sha256
index 6667e5f..89a9c57 100644
--- a/test/data/ui-screenshots/ui-chrome_rendering_desktop_load.png.sha256
+++ b/test/data/ui-screenshots/ui-chrome_rendering_desktop_load.png.sha256
@@ -1 +1 @@
-351edcf1ade9e6b1b7ced9d4f204e9a939370b7a56066f66793e56c9d93ec972
\ No newline at end of file
+d1a9ace55344d8a2850a8238b698892aca1ea2eacf80886420108043de8d3c56
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-chrome_rendering_desktop_select_slice_with_flows.png.sha256 b/test/data/ui-screenshots/ui-chrome_rendering_desktop_select_slice_with_flows.png.sha256
index 90d04b9..470075f 100644
--- a/test/data/ui-screenshots/ui-chrome_rendering_desktop_select_slice_with_flows.png.sha256
+++ b/test/data/ui-screenshots/ui-chrome_rendering_desktop_select_slice_with_flows.png.sha256
@@ -1 +1 @@
-3699ab1be1ccf7f41559fad373027c884b3f1539183f4b405e29852f01985937
\ No newline at end of file
+a97c6027c4bef120c4227a7ed32e6a6fb6b290938ef8d66652e6d369b7e5d157
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_navigate_open_trace_from_url.png.sha256 b/test/data/ui-screenshots/ui-routing_navigate_open_trace_from_url.png.sha256
index 92f9c01..a0ddb77 100644
--- a/test/data/ui-screenshots/ui-routing_navigate_open_trace_from_url.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_navigate_open_trace_from_url.png.sha256
@@ -1 +1 @@
-1bcbdbf6d1c2c1c2e77faa90be1c060b350f21472f67aed9477e6ba5e5219e81
\ No newline at end of file
+47cda8e8a9ed007945bff13d7c10fa4d33fc6e264c1198b2038a216559bec962
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_open_invalid_trace_from_blank_page.png.sha256 b/test/data/ui-screenshots/ui-routing_open_invalid_trace_from_blank_page.png.sha256
index bd02978..98f2571 100644
--- a/test/data/ui-screenshots/ui-routing_open_invalid_trace_from_blank_page.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_open_invalid_trace_from_blank_page.png.sha256
@@ -1 +1 @@
-0b44f0292e51fcf599f17622193d67b17bbaca02440cf2f0e994dbbbac65306a
\ No newline at end of file
+bd495271f97ffe17851f6605acaf24463c2363cb6a4bcf8e1b3fd78b9e18353f
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_access_subpage_then_go_back.png.sha256 b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_access_subpage_then_go_back.png.sha256
index ff33850..5b79980 100644
--- a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_access_subpage_then_go_back.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_access_subpage_then_go_back.png.sha256
@@ -1 +1 @@
-7d8429af94229b4cb96f3e7691e987b4eb0ade9683acce9a2c14c41777415d73
\ No newline at end of file
+ab93fa5646ab5e2bc63922ee8f6c6d7657f128fe7b5426df97d02f19c770a1bc
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_first_trace_from_url.png.sha256 b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_first_trace_from_url.png.sha256
index 92f9c01..a0ddb77 100644
--- a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_first_trace_from_url.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_first_trace_from_url.png.sha256
@@ -1 +1 @@
-1bcbdbf6d1c2c1c2e77faa90be1c060b350f21472f67aed9477e6ba5e5219e81
\ No newline at end of file
+47cda8e8a9ed007945bff13d7c10fa4d33fc6e264c1198b2038a216559bec962
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_second_trace_from_url.png.sha256 b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_second_trace_from_url.png.sha256
index ff33850..5b79980 100644
--- a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_second_trace_from_url.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_second_trace_from_url.png.sha256
@@ -1 +1 @@
-7d8429af94229b4cb96f3e7691e987b4eb0ade9683acce9a2c14c41777415d73
\ No newline at end of file
+ab93fa5646ab5e2bc63922ee8f6c6d7657f128fe7b5426df97d02f19c770a1bc
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_start_from_no_trace_go_back_to_first_trace.png.sha256 b/test/data/ui-screenshots/ui-routing_start_from_no_trace_go_back_to_first_trace.png.sha256
index ff33850..5b79980 100644
--- a/test/data/ui-screenshots/ui-routing_start_from_no_trace_go_back_to_first_trace.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_start_from_no_trace_go_back_to_first_trace.png.sha256
@@ -1 +1 @@
-7d8429af94229b4cb96f3e7691e987b4eb0ade9683acce9a2c14c41777415d73
\ No newline at end of file
+ab93fa5646ab5e2bc63922ee8f6c6d7657f128fe7b5426df97d02f19c770a1bc
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_invalid_trace.png.sha256 b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_invalid_trace.png.sha256
index 2fe4afb..d806076 100644
--- a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_invalid_trace.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_invalid_trace.png.sha256
@@ -1 +1 @@
-b3f9edabe8db232b481a7484c5230fa08d01f37336f9e60eaf6fbe8e8d0ded16
\ No newline at end of file
+2dc0e3ade667e7578fa6b5b8911177ab272300bfddb015c4979c3b4361d93047
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_second_trace.png.sha256 b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_second_trace.png.sha256
index 92f9c01..a0ddb77 100644
--- a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_second_trace.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_second_trace.png.sha256
@@ -1 +1 @@
-1bcbdbf6d1c2c1c2e77faa90be1c060b350f21472f67aed9477e6ba5e5219e81
\ No newline at end of file
+47cda8e8a9ed007945bff13d7c10fa4d33fc6e264c1198b2038a216559bec962
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_trace_.png.sha256 b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_trace_.png.sha256
index ff33850..5b79980 100644
--- a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_trace_.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_trace_.png.sha256
@@ -1 +1 @@
-7d8429af94229b4cb96f3e7691e987b4eb0ade9683acce9a2c14c41777415d73
\ No newline at end of file
+ab93fa5646ab5e2bc63922ee8f6c6d7657f128fe7b5426df97d02f19c770a1bc
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_start_from_no_trace_refresh.png.sha256 b/test/data/ui-screenshots/ui-routing_start_from_no_trace_refresh.png.sha256
index ff33850..5b79980 100644
--- a/test/data/ui-screenshots/ui-routing_start_from_no_trace_refresh.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_start_from_no_trace_refresh.png.sha256
@@ -1 +1 @@
-7d8429af94229b4cb96f3e7691e987b4eb0ade9683acce9a2c14c41777415d73
\ No newline at end of file
+ab93fa5646ab5e2bc63922ee8f6c6d7657f128fe7b5426df97d02f19c770a1bc
\ No newline at end of file
diff --git a/test/trace_processor/diff_tests/include_index.py b/test/trace_processor/diff_tests/include_index.py
index 65e2f53..fb9e893 100644
--- a/test/trace_processor/diff_tests/include_index.py
+++ b/test/trace_processor/diff_tests/include_index.py
@@ -96,6 +96,7 @@
 from diff_tests.stdlib.chrome.tests_scroll_jank import ChromeScrollJankStdlib
 from diff_tests.stdlib.common.tests import StdlibCommon
 from diff_tests.stdlib.common.tests import StdlibCommon
+from diff_tests.stdlib.counters.tests import StdlibCounterIntervals
 from diff_tests.stdlib.dynamic_tables.tests import DynamicTables
 from diff_tests.stdlib.intervals.tests import StdlibIntervals
 from diff_tests.stdlib.graphs.dominator_tree_tests import DominatorTree
@@ -245,6 +246,8 @@
       *DominatorTree(index_path, 'stdlib/graphs', 'DominatorTree').fetch(),
       *GraphSearchTests(index_path, 'stdlib/graphs',
                         'GraphSearchTests').fetch(),
+      *StdlibCounterIntervals(index_path, 'stdlib/counters',
+                       'StdlibCounterIntervals').fetch(),
       *DynamicTables(index_path, 'stdlib/dynamic_tables',
                      'DynamicTables').fetch(),
       *LinuxStdlib(index_path, 'stdlib/linux', 'LinuxStdlib').fetch(),
diff --git a/test/trace_processor/diff_tests/metrics/android/android_binder_metric.out b/test/trace_processor/diff_tests/metrics/android/android_binder_metric.out
index 02b1a94..f775c1c 100644
--- a/test/trace_processor/diff_tests/metrics/android/android_binder_metric.out
+++ b/test/trace_processor/diff_tests/metrics/android/android_binder_metric.out
@@ -394,6 +394,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: true
+    client_monotonic_dur: 95231
+    server_monotonic_dur: 69578
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -436,6 +438,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: true
+    client_monotonic_dur: 43573
+    server_monotonic_dur: 27121
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -478,6 +482,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 202525
+    server_monotonic_dur: 41745
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -523,6 +529,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 860460
+    server_monotonic_dur: 414084
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R+"
@@ -571,6 +579,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 202316
+    server_monotonic_dur: 70056
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -616,6 +626,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 38251304
+    server_monotonic_dur: 38200895
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -670,6 +682,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 500023
+    server_monotonic_dur: 75821
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -709,6 +723,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 299709
+    server_monotonic_dur: 267477
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -751,6 +767,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 393550
+    server_monotonic_dur: 56007
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -790,6 +808,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1823483
+    server_monotonic_dur: 181296
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -832,6 +852,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 297674
+    server_monotonic_dur: 55289
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -871,6 +893,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 620828
+    server_monotonic_dur: 596153
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -931,6 +955,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 521568
+    server_monotonic_dur: 47331
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -970,6 +996,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1370676
+    server_monotonic_dur: 1345615
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -1024,6 +1052,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 2175477
+    server_monotonic_dur: 47722
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1063,6 +1093,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1169019
+    server_monotonic_dur: 1141762
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R+"
@@ -1111,6 +1143,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 61263
+    server_monotonic_dur: 31411
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1150,6 +1184,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1388131
+    server_monotonic_dur: 872670
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R+"
@@ -1198,6 +1234,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 311771
+    server_monotonic_dur: 27727
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1237,6 +1275,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 7858970
+    server_monotonic_dur: 2350825
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -1297,6 +1337,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 67201
+    server_monotonic_dur: 27173
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1342,6 +1384,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1292793
+    server_monotonic_dur: 1269359
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R+"
@@ -1390,6 +1434,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 3536113
+    server_monotonic_dur: 25815
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1435,6 +1481,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 166354
+    server_monotonic_dur: 142006
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1477,6 +1525,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1725498
+    server_monotonic_dur: 24403
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1522,6 +1572,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2047907
+    server_monotonic_dur: 135992
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1564,6 +1616,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 313744
+    server_monotonic_dur: 23708
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1609,6 +1663,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 4590941
+    server_monotonic_dur: 4568826
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -1663,6 +1719,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: true
+    client_monotonic_dur: 56472
+    server_monotonic_dur: 10317
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1705,6 +1763,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 144039
+    server_monotonic_dur: 38296
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1747,6 +1807,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 2003890
+    server_monotonic_dur: 32711
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1789,6 +1851,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 392431
+    server_monotonic_dur: 20812
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1831,6 +1895,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 51336
+    server_monotonic_dur: 26061
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1873,6 +1939,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 15839
+    server_monotonic_dur: 3585
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1915,6 +1983,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 15392
+    server_monotonic_dur: 3595
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1957,6 +2027,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 17425
+    server_monotonic_dur: 4477
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -1999,6 +2071,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 777037
+    server_monotonic_dur: 25923
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2044,6 +2118,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 4404779
+    server_monotonic_dur: 3637769
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -2104,6 +2180,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 52503
+    server_monotonic_dur: 27259
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2146,6 +2224,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25350
+    server_monotonic_dur: 5866
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2188,6 +2268,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 53694
+    server_monotonic_dur: 33643
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2230,6 +2312,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 2395684
+    server_monotonic_dur: 37402
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2272,6 +2356,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 366288
+    server_monotonic_dur: 36664
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2314,6 +2400,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 130646
+    server_monotonic_dur: 58132
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2356,6 +2444,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 130331
+    server_monotonic_dur: 16252
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2398,6 +2488,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 73652
+    server_monotonic_dur: 16599
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2440,6 +2532,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 45088
+    server_monotonic_dur: 12097
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2482,6 +2576,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 169228
+    server_monotonic_dur: 81542
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2521,6 +2617,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 4400718
+    server_monotonic_dur: 3221518
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -2575,6 +2673,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 100089
+    server_monotonic_dur: 59307
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2617,6 +2717,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41765
+    server_monotonic_dur: 9571
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2659,6 +2761,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 84971
+    server_monotonic_dur: 53184
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2701,6 +2805,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 3250971
+    server_monotonic_dur: 23743
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2743,6 +2849,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 4622690
+    server_monotonic_dur: 16844
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2785,6 +2893,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 45134
+    server_monotonic_dur: 26738
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2827,6 +2937,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 17082
+    server_monotonic_dur: 4408
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2869,6 +2981,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 20947
+    server_monotonic_dur: 6173
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2911,6 +3025,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 20872
+    server_monotonic_dur: 5922
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2953,6 +3069,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 81291
+    server_monotonic_dur: 44407
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -2998,6 +3116,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 13104821
+    server_monotonic_dur: 10086524
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -3058,6 +3178,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 56023
+    server_monotonic_dur: 31643
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3100,6 +3222,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25346
+    server_monotonic_dur: 5833
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3142,6 +3266,8 @@
     server_pid: 551
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 53012
+    server_monotonic_dur: 33177
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3184,6 +3310,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 65209
+    server_monotonic_dur: 38541
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3226,6 +3354,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 76725
+    server_monotonic_dur: 32135
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3268,6 +3398,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 101929
+    server_monotonic_dur: 69823
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3310,6 +3442,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 467516
+    server_monotonic_dur: 402831
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3352,6 +3486,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 7998432
+    server_monotonic_dur: 7890742
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3394,6 +3530,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 307840
+    server_monotonic_dur: 254236
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3436,6 +3574,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 5767125
+    server_monotonic_dur: 5717518
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3478,6 +3618,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 318968
+    server_monotonic_dur: 253598
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3520,6 +3662,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 7219754
+    server_monotonic_dur: 7157982
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3562,6 +3706,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 72915
+    server_monotonic_dur: 28616
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3604,6 +3750,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 240886
+    server_monotonic_dur: 190621
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3646,6 +3794,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 6382365
+    server_monotonic_dur: 6324177
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3688,6 +3838,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 63068
+    server_monotonic_dur: 21824
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3730,6 +3882,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 307675
+    server_monotonic_dur: 243984
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3772,6 +3926,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 7105430
+    server_monotonic_dur: 7047015
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3814,6 +3970,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 302902
+    server_monotonic_dur: 241791
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3856,6 +4014,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 7062027
+    server_monotonic_dur: 7001067
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3898,6 +4058,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 234069
+    server_monotonic_dur: 188364
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3940,6 +4102,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 5952658
+    server_monotonic_dur: 5894438
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -3982,6 +4146,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 71591
+    server_monotonic_dur: 25657
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4024,6 +4190,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 52660
+    server_monotonic_dur: 27518
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4066,6 +4234,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 29903
+    server_monotonic_dur: 11639
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4108,6 +4278,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 196774
+    server_monotonic_dur: 159951
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4150,6 +4322,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 3593496
+    server_monotonic_dur: 3543071
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -4198,6 +4372,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 32496
+    server_monotonic_dur: 12670
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4240,6 +4416,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 322810
+    server_monotonic_dur: 271515
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4282,6 +4460,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 4789815
+    server_monotonic_dur: 4749936
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4324,6 +4504,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 172609
+    server_monotonic_dur: 83158
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4366,6 +4548,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 227959
+    server_monotonic_dur: 194408
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4408,6 +4592,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 3824489
+    server_monotonic_dur: 3792958
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4450,6 +4636,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36050
+    server_monotonic_dur: 11449
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4492,6 +4680,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 155647
+    server_monotonic_dur: 126114
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4534,6 +4724,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 3808921
+    server_monotonic_dur: 3779150
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4576,6 +4768,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 153558
+    server_monotonic_dur: 124607
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4618,6 +4812,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 4194491
+    server_monotonic_dur: 4164444
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4660,6 +4856,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 303333
+    server_monotonic_dur: 238760
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4702,6 +4900,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 7572237
+    server_monotonic_dur: 7512667
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4744,6 +4944,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 252907
+    server_monotonic_dur: 202551
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4786,6 +4988,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 5273018
+    server_monotonic_dur: 5228369
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4828,6 +5032,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 128418
+    server_monotonic_dur: 102458
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4870,6 +5076,8 @@
     server_pid: 432
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 3754229
+    server_monotonic_dur: 3723508
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -4912,6 +5120,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1068999945
+    server_monotonic_dur: 1068765551
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -4972,6 +5182,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1007359989
+    server_monotonic_dur: 1007181543
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -5035,6 +5247,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 802033
+    server_monotonic_dur: 538261
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5080,6 +5294,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 250272
+    server_monotonic_dur: 220155
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5125,6 +5341,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 805818
+    server_monotonic_dur: 514727
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5170,6 +5388,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 741859
+    server_monotonic_dur: 583186
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5215,6 +5435,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 717832
+    server_monotonic_dur: 534435
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5257,6 +5479,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1653373
+    server_monotonic_dur: 1493995
     client_package_version_code: 309999900
     is_client_package_debuggable: false
     thread_states {
@@ -5307,6 +5531,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 680791
+    server_monotonic_dur: 615060
     client_package_version_code: 309999900
     is_client_package_debuggable: false
     thread_states {
@@ -5351,6 +5577,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 598626
+    server_monotonic_dur: 539782
     client_package_version_code: 309999900
     is_client_package_debuggable: false
     thread_states {
@@ -5395,6 +5623,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 419781
+    server_monotonic_dur: 297993
     client_package_version_code: 309999900
     is_client_package_debuggable: false
     thread_states {
@@ -5439,6 +5669,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 826593
+    server_monotonic_dur: 395910
     client_package_version_code: 309999900
     is_client_package_debuggable: false
     thread_states {
@@ -5486,6 +5718,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 753656
+    server_monotonic_dur: 702862
     client_package_version_code: 309999900
     is_client_package_debuggable: false
     thread_states {
@@ -5527,6 +5761,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 5266197
+    server_monotonic_dur: 5130061
     client_package_version_code: 309999900
     is_client_package_debuggable: false
     thread_states {
@@ -5586,6 +5822,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 226078
+    server_monotonic_dur: 175555
     client_package_version_code: 309999900
     is_client_package_debuggable: false
     thread_states {
@@ -5633,6 +5871,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 4885909
+    server_monotonic_dur: 320746
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5678,6 +5918,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 330799
+    server_monotonic_dur: 272198
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5723,6 +5965,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 616676
+    server_monotonic_dur: 298418
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5768,6 +6012,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1410945
+    server_monotonic_dur: 200898
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5813,6 +6059,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 872295
+    server_monotonic_dur: 182774
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5858,6 +6106,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 637521
+    server_monotonic_dur: 325617
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5897,6 +6147,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 191825
+    server_monotonic_dur: 165334
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5936,6 +6188,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 5323539
+    server_monotonic_dur: 294315
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -5981,6 +6235,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 243315
+    server_monotonic_dur: 214612
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -6020,6 +6276,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 4092197
+    server_monotonic_dur: 315322
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -6065,6 +6323,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1563939
+    server_monotonic_dur: 200101
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -6110,6 +6370,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 161382
+    server_monotonic_dur: 104816
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -6155,6 +6417,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 4654877
+    server_monotonic_dur: 328348
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -6200,6 +6464,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 5707100
+    server_monotonic_dur: 146733
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -6241,6 +6507,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 122224
+    server_monotonic_dur: 20216
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -6276,6 +6544,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 302731
+    server_monotonic_dur: 230331
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -6311,6 +6581,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 47695555
+    server_monotonic_dur: 47295469
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -6371,6 +6643,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 228157
+    server_monotonic_dur: 6096
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6409,6 +6683,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 66349
+    server_monotonic_dur: 29706
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6450,6 +6726,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 10413366
+    server_monotonic_dur: 7824177
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6509,6 +6787,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 142447
+    server_monotonic_dur: 107780
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6556,6 +6836,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 201915
+    server_monotonic_dur: 177114
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6603,6 +6885,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 127224
+    server_monotonic_dur: 100335
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6650,6 +6934,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 239313
+    server_monotonic_dur: 170695
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6703,6 +6989,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 155029
+    server_monotonic_dur: 122075
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6750,6 +7038,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 97646
+    server_monotonic_dur: 73450
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6797,6 +7087,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 99500
+    server_monotonic_dur: 76612
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6844,6 +7136,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 250959
+    server_monotonic_dur: 226725
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6888,6 +7182,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 67962
+    server_monotonic_dur: 30308
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6929,6 +7225,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 154178
+    server_monotonic_dur: 124753
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -6976,6 +7274,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 106250
+    server_monotonic_dur: 80915
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7023,6 +7323,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 74906
+    server_monotonic_dur: 55191
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7070,6 +7372,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 71921
+    server_monotonic_dur: 52769
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7117,6 +7421,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 70654
+    server_monotonic_dur: 51674
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7161,6 +7467,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 64107
+    server_monotonic_dur: 26260
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7202,6 +7510,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 300661
+    server_monotonic_dur: 271896
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7249,6 +7559,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 191707
+    server_monotonic_dur: 159329
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7302,6 +7614,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 236014
+    server_monotonic_dur: 209844
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7349,6 +7663,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 677589
+    server_monotonic_dur: 639717
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7399,6 +7715,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 500344
+    server_monotonic_dur: 407163
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7446,6 +7764,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 130923
+    server_monotonic_dur: 104818
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7493,6 +7813,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 257727
+    server_monotonic_dur: 225960
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7540,6 +7862,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 207311
+    server_monotonic_dur: 141411
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7587,6 +7911,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 315861
+    server_monotonic_dur: 248947
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7634,6 +7960,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 259030
+    server_monotonic_dur: 236355
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7681,6 +8009,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 92883
+    server_monotonic_dur: 69001
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7728,6 +8058,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 188318
+    server_monotonic_dur: 166081
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7775,6 +8107,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 119066
+    server_monotonic_dur: 95747
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7822,6 +8156,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 237081
+    server_monotonic_dur: 209149
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7866,6 +8202,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 591366
+    server_monotonic_dur: 21891
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7907,6 +8245,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 111577
+    server_monotonic_dur: 86098
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -7954,6 +8294,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 189877
+    server_monotonic_dur: 167791
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8001,6 +8343,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 123707
+    server_monotonic_dur: 100048
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8048,6 +8392,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 228156
+    server_monotonic_dur: 201512
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8095,6 +8441,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 109512
+    server_monotonic_dur: 87276
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8142,6 +8490,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 232518
+    server_monotonic_dur: 209672
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8189,6 +8539,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 124783
+    server_monotonic_dur: 102909
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8236,6 +8588,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 244152
+    server_monotonic_dur: 217049
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8283,6 +8637,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 113353
+    server_monotonic_dur: 85375
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8324,6 +8680,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 227758
+    server_monotonic_dur: 187703
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8371,6 +8729,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 139295
+    server_monotonic_dur: 116093
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8412,6 +8772,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 264361
+    server_monotonic_dur: 234913
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8459,6 +8821,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 918856
+    server_monotonic_dur: 866310
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8518,6 +8882,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 796036
+    server_monotonic_dur: 321918
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8565,6 +8931,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 765487
+    server_monotonic_dur: 462664
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8612,6 +8980,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 481038
+    server_monotonic_dur: 361607
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8659,6 +9029,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 254494
+    server_monotonic_dur: 159330
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8706,6 +9078,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 309870
+    server_monotonic_dur: 220751
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8753,6 +9127,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 12677155
+    server_monotonic_dur: 147315
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8800,6 +9176,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 447621
+    server_monotonic_dur: 137704
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8847,6 +9225,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 191006
+    server_monotonic_dur: 164185
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8894,6 +9274,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 88522
+    server_monotonic_dur: 66721
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8941,6 +9323,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 957260
+    server_monotonic_dur: 95254
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -8988,6 +9372,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 578954
+    server_monotonic_dur: 365934
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9035,6 +9421,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 485812
+    server_monotonic_dur: 386791
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9082,6 +9470,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 250757
+    server_monotonic_dur: 166179
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9129,6 +9519,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 302881
+    server_monotonic_dur: 223517
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9176,6 +9568,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 3153591
+    server_monotonic_dur: 3025709
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9229,6 +9623,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 619943
+    server_monotonic_dur: 375734
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9276,6 +9672,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 431181
+    server_monotonic_dur: 318223
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9323,6 +9721,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 245663
+    server_monotonic_dur: 157246
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9370,6 +9770,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 380826
+    server_monotonic_dur: 297627
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9417,6 +9819,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 169230
+    server_monotonic_dur: 135040
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9464,6 +9868,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 160294
+    server_monotonic_dur: 138267
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9511,6 +9917,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 82925
+    server_monotonic_dur: 62558
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9558,6 +9966,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 109806
+    server_monotonic_dur: 89862
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9605,6 +10015,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 322167
+    server_monotonic_dur: 258351
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9652,6 +10064,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2993666
+    server_monotonic_dur: 861059
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9699,6 +10113,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 840445
+    server_monotonic_dur: 305801
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9740,6 +10156,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 827415
+    server_monotonic_dur: 784522
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9781,6 +10199,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 7322317
+    server_monotonic_dur: 93163
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9828,6 +10248,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 657190
+    server_monotonic_dur: 628491
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9875,6 +10297,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 451291
+    server_monotonic_dur: 426847
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9922,6 +10346,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 166904
+    server_monotonic_dur: 143790
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -9963,6 +10389,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 165778
+    server_monotonic_dur: 142948
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10004,6 +10432,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 230422
+    server_monotonic_dur: 206586
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10045,6 +10475,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 630450
+    server_monotonic_dur: 579789
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10101,6 +10533,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 119820
+    server_monotonic_dur: 28811
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10145,6 +10579,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 104172
+    server_monotonic_dur: 56403
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10192,6 +10628,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 322775
+    server_monotonic_dur: 295239
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10236,6 +10674,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 8016835
+    server_monotonic_dur: 7972329
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10292,6 +10732,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 228254
+    server_monotonic_dur: 205277
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10348,6 +10790,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 28403
+    server_monotonic_dur: 6640
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10392,6 +10836,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25556
+    server_monotonic_dur: 5569
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10436,6 +10882,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25344
+    server_monotonic_dur: 5525
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10480,6 +10928,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25346
+    server_monotonic_dur: 5607
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10524,6 +10974,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 27703
+    server_monotonic_dur: 6657
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10568,6 +11020,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 27032
+    server_monotonic_dur: 6047
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10612,6 +11066,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25479
+    server_monotonic_dur: 5572
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10656,6 +11112,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 26363
+    server_monotonic_dur: 5671
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10700,6 +11158,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 33909
+    server_monotonic_dur: 10452
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10744,6 +11204,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 27054
+    server_monotonic_dur: 6928
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10788,6 +11250,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25578
+    server_monotonic_dur: 5689
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10832,6 +11296,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25680
+    server_monotonic_dur: 5721
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10876,6 +11342,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25437
+    server_monotonic_dur: 5574
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10920,6 +11388,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25612
+    server_monotonic_dur: 5467
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -10964,6 +11434,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25288
+    server_monotonic_dur: 5467
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11008,6 +11480,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25190
+    server_monotonic_dur: 5460
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11052,6 +11526,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25439
+    server_monotonic_dur: 5683
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11096,6 +11572,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25378
+    server_monotonic_dur: 5557
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11140,6 +11618,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25672
+    server_monotonic_dur: 5494
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11184,6 +11664,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25248
+    server_monotonic_dur: 5521
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11228,6 +11710,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35238
+    server_monotonic_dur: 13912
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11272,6 +11756,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 84755
+    server_monotonic_dur: 37800
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11316,6 +11802,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21415376
+    server_monotonic_dur: 21387270
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11372,6 +11860,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 229234
+    server_monotonic_dur: 205390
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11428,6 +11918,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 28964
+    server_monotonic_dur: 6652
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11472,6 +11964,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25639
+    server_monotonic_dur: 5583
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11516,6 +12010,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25438
+    server_monotonic_dur: 5569
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11560,6 +12056,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25489
+    server_monotonic_dur: 5618
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11604,6 +12102,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25401
+    server_monotonic_dur: 5562
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11648,6 +12148,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25446
+    server_monotonic_dur: 5589
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11692,6 +12194,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25834
+    server_monotonic_dur: 5504
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11736,6 +12240,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25620
+    server_monotonic_dur: 5490
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11780,6 +12286,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25884
+    server_monotonic_dur: 5733
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11824,6 +12332,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25400
+    server_monotonic_dur: 5544
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11868,6 +12378,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25361
+    server_monotonic_dur: 5594
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11912,6 +12424,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25623
+    server_monotonic_dur: 5721
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -11956,6 +12470,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25457
+    server_monotonic_dur: 5550
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12000,6 +12516,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25274
+    server_monotonic_dur: 5486
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12044,6 +12562,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25443
+    server_monotonic_dur: 5605
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12088,6 +12608,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25391
+    server_monotonic_dur: 5521
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12132,6 +12654,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25435
+    server_monotonic_dur: 5576
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12176,6 +12700,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25823
+    server_monotonic_dur: 5556
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12220,6 +12746,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25503
+    server_monotonic_dur: 5586
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12264,6 +12792,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25860
+    server_monotonic_dur: 5710
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12308,6 +12838,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 32862
+    server_monotonic_dur: 13162
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12352,6 +12884,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 166297
+    server_monotonic_dur: 61520
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12396,6 +12930,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 8203900
+    server_monotonic_dur: 8148772
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12458,6 +12994,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 384794
+    server_monotonic_dur: 347231
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12514,6 +13052,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 46318
+    server_monotonic_dur: 10866
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12558,6 +13098,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41880
+    server_monotonic_dur: 9661
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12602,6 +13144,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 42485
+    server_monotonic_dur: 9626
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12646,6 +13190,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41474
+    server_monotonic_dur: 9586
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12690,6 +13236,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41412
+    server_monotonic_dur: 9309
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12734,6 +13282,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 42033
+    server_monotonic_dur: 9392
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12778,6 +13328,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41387
+    server_monotonic_dur: 9302
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12822,6 +13374,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41084
+    server_monotonic_dur: 9220
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12866,6 +13420,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41301
+    server_monotonic_dur: 9415
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12910,6 +13466,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41398
+    server_monotonic_dur: 9322
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12954,6 +13512,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41560
+    server_monotonic_dur: 9590
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -12998,6 +13558,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 50617
+    server_monotonic_dur: 14177
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13042,6 +13604,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41628
+    server_monotonic_dur: 9494
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13086,6 +13650,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41848
+    server_monotonic_dur: 9338
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13130,6 +13696,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41157
+    server_monotonic_dur: 9281
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13174,6 +13742,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40899
+    server_monotonic_dur: 9288
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13218,6 +13788,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41246
+    server_monotonic_dur: 9556
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13262,6 +13834,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41321
+    server_monotonic_dur: 9445
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13306,6 +13880,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40925
+    server_monotonic_dur: 9283
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13350,6 +13926,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41127
+    server_monotonic_dur: 9552
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13394,6 +13972,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 387578
+    server_monotonic_dur: 351226
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13447,6 +14027,8 @@
     server_pid: 227
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 263198
+    server_monotonic_dur: 147077
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13494,6 +14076,8 @@
     server_pid: 227
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 94966
+    server_monotonic_dur: 40099
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13541,6 +14125,8 @@
     server_pid: 227
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 50151
+    server_monotonic_dur: 12420
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13588,6 +14174,8 @@
     server_pid: 227
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 83809
+    server_monotonic_dur: 46436
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13635,6 +14223,8 @@
     server_pid: 227
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 82894
+    server_monotonic_dur: 22609
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13682,6 +14272,8 @@
     server_pid: 227
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 73495
+    server_monotonic_dur: 22894
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13729,6 +14321,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 219947
+    server_monotonic_dur: 148041
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13776,6 +14370,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 69210
+    server_monotonic_dur: 24451
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13823,6 +14419,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 45420
+    server_monotonic_dur: 13297
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13870,6 +14468,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 42724
+    server_monotonic_dur: 9189
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13917,6 +14517,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40940
+    server_monotonic_dur: 7896
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -13964,6 +14566,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 48291
+    server_monotonic_dur: 16180
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14011,6 +14615,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1936574
+    server_monotonic_dur: 1837670
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14052,6 +14658,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 93664
+    server_monotonic_dur: 34493
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14099,6 +14707,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 60079
+    server_monotonic_dur: 15406
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14146,6 +14756,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 100543
+    server_monotonic_dur: 36266
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14187,6 +14799,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 92697
+    server_monotonic_dur: 31308
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14228,6 +14842,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 110940
+    server_monotonic_dur: 43318
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14269,6 +14885,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 116782
+    server_monotonic_dur: 39838
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14310,6 +14928,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 216902
+    server_monotonic_dur: 76249
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14351,6 +14971,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 106017
+    server_monotonic_dur: 37024
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14392,6 +15014,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 87275
+    server_monotonic_dur: 27460
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14433,6 +15057,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 90924
+    server_monotonic_dur: 28396
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14474,6 +15100,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 92296
+    server_monotonic_dur: 28088
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14515,6 +15143,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 86354
+    server_monotonic_dur: 26116
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14556,6 +15186,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 88431
+    server_monotonic_dur: 26404
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14597,6 +15229,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 77898
+    server_monotonic_dur: 17389
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14638,6 +15272,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 57647
+    server_monotonic_dur: 17423
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14679,6 +15315,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 65380
+    server_monotonic_dur: 19929
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14720,6 +15358,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 63549
+    server_monotonic_dur: 18630
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14761,6 +15401,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 58003
+    server_monotonic_dur: 17697
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14802,6 +15444,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 103582
+    server_monotonic_dur: 19948
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14843,6 +15487,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 58251
+    server_monotonic_dur: 17667
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14884,6 +15530,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 57571
+    server_monotonic_dur: 17477
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14925,6 +15573,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 57586
+    server_monotonic_dur: 17432
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -14966,6 +15616,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 56988
+    server_monotonic_dur: 17197
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15007,6 +15659,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 57557
+    server_monotonic_dur: 17391
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15048,6 +15702,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 57720
+    server_monotonic_dur: 17590
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15089,6 +15745,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 61967
+    server_monotonic_dur: 20232
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15130,6 +15788,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 124321
+    server_monotonic_dur: 21151
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15171,6 +15831,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 58406
+    server_monotonic_dur: 17846
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15212,6 +15874,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 122522
+    server_monotonic_dur: 22467
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15253,6 +15917,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 108945
+    server_monotonic_dur: 21826
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15294,6 +15960,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 115625
+    server_monotonic_dur: 21876
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15335,6 +16003,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 117689
+    server_monotonic_dur: 21673
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15376,6 +16046,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 68086
+    server_monotonic_dur: 22255
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15417,6 +16089,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 354924
+    server_monotonic_dur: 135304
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15458,6 +16132,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 62081
+    server_monotonic_dur: 19429
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15499,6 +16175,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 60439
+    server_monotonic_dur: 18752
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15540,6 +16218,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 59383
+    server_monotonic_dur: 17430
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15581,6 +16261,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 71084
+    server_monotonic_dur: 22266
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15622,6 +16304,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 167837
+    server_monotonic_dur: 36313
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15663,6 +16347,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 101582
+    server_monotonic_dur: 27119
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15704,6 +16390,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1475488
+    server_monotonic_dur: 25170
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15745,6 +16433,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 72281
+    server_monotonic_dur: 24739
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15786,6 +16476,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 96807
+    server_monotonic_dur: 44972
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15827,6 +16519,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 75274
+    server_monotonic_dur: 33925
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15868,6 +16562,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 378935
+    server_monotonic_dur: 31989
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15915,6 +16611,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 119384
+    server_monotonic_dur: 61982
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -15968,6 +16666,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 71154
+    server_monotonic_dur: 40896
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16009,6 +16709,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40260
+    server_monotonic_dur: 12949
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16050,6 +16752,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 53353
+    server_monotonic_dur: 20694
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16091,6 +16795,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 58113
+    server_monotonic_dur: 25670
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16129,6 +16835,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1039850
+    server_monotonic_dur: 508063
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16185,6 +16893,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 150984
+    server_monotonic_dur: 35920
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16223,6 +16933,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 136562
+    server_monotonic_dur: 50827
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16270,6 +16982,8 @@
     server_pid: 563
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 316824
+    server_monotonic_dur: 105755
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16326,6 +17040,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 203191
+    server_monotonic_dur: 64617
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16370,6 +17086,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 248354
+    server_monotonic_dur: 34787
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16417,6 +17135,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 727557
+    server_monotonic_dur: 660183
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16464,6 +17184,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1181407
+    server_monotonic_dur: 1111603
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16511,6 +17233,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1189317
+    server_monotonic_dur: 990715
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16558,6 +17282,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 927854
+    server_monotonic_dur: 805846
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16605,6 +17331,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 512420
+    server_monotonic_dur: 323254
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16652,6 +17380,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1487742
+    server_monotonic_dur: 1376590
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16699,6 +17429,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1449926
+    server_monotonic_dur: 1274408
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16746,6 +17478,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1298528
+    server_monotonic_dur: 1132551
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16793,6 +17527,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1454881
+    server_monotonic_dur: 1329844
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16840,6 +17576,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1800013
+    server_monotonic_dur: 1657903
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16887,6 +17625,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 247342
+    server_monotonic_dur: 193288
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16934,6 +17674,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 965478
+    server_monotonic_dur: 920088
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -16975,6 +17717,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1020780
+    server_monotonic_dur: 971950
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17022,6 +17766,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 959262
+    server_monotonic_dur: 906515
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17063,6 +17809,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 899049
+    server_monotonic_dur: 847940
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17104,6 +17852,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 909425
+    server_monotonic_dur: 858090
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17145,6 +17895,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1743948
+    server_monotonic_dur: 1673704
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17204,6 +17956,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 623698
+    server_monotonic_dur: 573369
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17245,6 +17999,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 15941493
+    server_monotonic_dur: 15891830
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17316,6 +18072,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1234219
+    server_monotonic_dur: 845821
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17369,6 +18127,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1291793
+    server_monotonic_dur: 1164551
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17416,6 +18176,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1943031
+    server_monotonic_dur: 939945
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17457,6 +18219,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1156924
+    server_monotonic_dur: 1082065
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17504,6 +18268,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 809167
+    server_monotonic_dur: 756459
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17551,6 +18317,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 678940
+    server_monotonic_dur: 635139
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17592,6 +18360,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 145751
+    server_monotonic_dur: 118650
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17633,6 +18403,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 530901
+    server_monotonic_dur: 500761
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17674,6 +18446,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 571584
+    server_monotonic_dur: 538071
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17715,6 +18489,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 552449
+    server_monotonic_dur: 520327
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17756,6 +18532,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 534612
+    server_monotonic_dur: 501212
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17797,6 +18575,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 536245
+    server_monotonic_dur: 503037
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17838,6 +18618,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1357351
+    server_monotonic_dur: 363694
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17879,6 +18661,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 420625
+    server_monotonic_dur: 394176
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17920,6 +18704,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1315862
+    server_monotonic_dur: 383396
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -17985,6 +18771,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 136670
+    server_monotonic_dur: 110994
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18026,6 +18814,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 508115
+    server_monotonic_dur: 480013
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18067,6 +18857,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 546196
+    server_monotonic_dur: 514929
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18108,6 +18900,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 524877
+    server_monotonic_dur: 493791
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18149,6 +18943,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 731991
+    server_monotonic_dur: 486628
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18190,6 +18986,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 716531
+    server_monotonic_dur: 684885
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18237,6 +19035,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 984986
+    server_monotonic_dur: 824723
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18278,6 +19078,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 502280
+    server_monotonic_dur: 438518
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18325,6 +19127,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1312257
+    server_monotonic_dur: 423528
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18372,6 +19176,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 3453818
+    server_monotonic_dur: 3361174
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18409,6 +19215,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 82151
+    server_monotonic_dur: 9960
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18452,6 +19260,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 176250
+    server_monotonic_dur: 131473
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18492,6 +19302,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 5999061
+    server_monotonic_dur: 5849109
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18545,6 +19357,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 233849
+    server_monotonic_dur: 199545
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18586,6 +19400,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 252552
+    server_monotonic_dur: 223077
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18627,6 +19443,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 204078
+    server_monotonic_dur: 172783
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18668,6 +19486,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 153994
+    server_monotonic_dur: 126916
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18709,6 +19529,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 182889
+    server_monotonic_dur: 154702
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18750,6 +19572,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 137217
+    server_monotonic_dur: 113244
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18791,6 +19615,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 118992
+    server_monotonic_dur: 97325
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18832,6 +19658,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 299443
+    server_monotonic_dur: 276814
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18870,6 +19698,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 283374
+    server_monotonic_dur: 135161
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18917,6 +19747,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 167484
+    server_monotonic_dur: 139418
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18958,6 +19790,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 145919
+    server_monotonic_dur: 118980
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -18999,6 +19833,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 74185
+    server_monotonic_dur: 55392
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19040,6 +19876,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 69978
+    server_monotonic_dur: 51751
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19081,6 +19919,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 68327
+    server_monotonic_dur: 50504
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19119,6 +19959,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 100638
+    server_monotonic_dur: 42296
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19166,6 +20008,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 342282
+    server_monotonic_dur: 315981
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19207,6 +20051,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 480814
+    server_monotonic_dur: 394591
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19254,6 +20100,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 272641
+    server_monotonic_dur: 212207
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19301,6 +20149,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 583763
+    server_monotonic_dur: 429944
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19342,6 +20192,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 433335
+    server_monotonic_dur: 355820
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19389,6 +20241,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 278251
+    server_monotonic_dur: 213908
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19433,6 +20287,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 219209
+    server_monotonic_dur: 91134
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19477,6 +20333,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 139801
+    server_monotonic_dur: 59523
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19521,6 +20379,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 83159
+    server_monotonic_dur: 50751
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19559,6 +20419,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 114800
+    server_monotonic_dur: 39897
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19603,6 +20465,8 @@
     server_pid: 529
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 89284
+    server_monotonic_dur: 35183
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19650,6 +20514,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1765942
+    server_monotonic_dur: 1639703
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19694,6 +20560,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1128986
+    server_monotonic_dur: 966934
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19738,6 +20606,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1207202
+    server_monotonic_dur: 1050055
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19785,6 +20655,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 325502
+    server_monotonic_dur: 249321
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19832,6 +20704,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 195976
+    server_monotonic_dur: 165659
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19873,6 +20747,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 775714
+    server_monotonic_dur: 675697
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19920,6 +20796,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 291851
+    server_monotonic_dur: 212472
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -19964,6 +20842,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 211605
+    server_monotonic_dur: 130702
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20002,6 +20882,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 171873
+    server_monotonic_dur: 73511
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20052,6 +20934,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 94665
+    server_monotonic_dur: 36111
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20096,6 +20980,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 53570
+    server_monotonic_dur: 16168
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20140,6 +21026,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 60943
+    server_monotonic_dur: 13010
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20184,6 +21072,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 120844
+    server_monotonic_dur: 48153
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20222,6 +21112,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 50136
+    server_monotonic_dur: 8170
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20266,6 +21158,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 207533
+    server_monotonic_dur: 152273
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20310,6 +21204,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 73766
+    server_monotonic_dur: 32288
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20354,6 +21250,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 47558
+    server_monotonic_dur: 11184
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20401,6 +21299,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 770712
+    server_monotonic_dur: 643264
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20448,6 +21348,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1020490
+    server_monotonic_dur: 851167
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20501,6 +21403,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 455959
+    server_monotonic_dur: 343077
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20548,6 +21452,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 393022
+    server_monotonic_dur: 303161
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20595,6 +21501,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 313561
+    server_monotonic_dur: 255077
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20642,6 +21550,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 190578
+    server_monotonic_dur: 134753
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20689,6 +21599,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1139946
+    server_monotonic_dur: 1084235
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20736,6 +21648,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 912985
+    server_monotonic_dur: 856225
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20783,6 +21697,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 857508
+    server_monotonic_dur: 806911
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20836,6 +21752,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 747168
+    server_monotonic_dur: 666508
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20889,6 +21807,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 491535
+    server_monotonic_dur: 440583
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20936,6 +21856,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 490048
+    server_monotonic_dur: 437941
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -20989,6 +21911,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2177244
+    server_monotonic_dur: 389987
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21030,6 +21954,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 498121
+    server_monotonic_dur: 401681
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21071,6 +21997,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 246018
+    server_monotonic_dur: 205622
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21112,6 +22040,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 203694
+    server_monotonic_dur: 171323
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21153,6 +22083,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 4994400
+    server_monotonic_dur: 142288
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21194,6 +22126,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 233732
+    server_monotonic_dur: 199800
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21235,6 +22169,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 180445
+    server_monotonic_dur: 151129
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21276,6 +22212,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 169394
+    server_monotonic_dur: 140597
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21317,6 +22255,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 240417
+    server_monotonic_dur: 197934
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21364,6 +22304,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 177706
+    server_monotonic_dur: 149198
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21405,6 +22347,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 173583
+    server_monotonic_dur: 146010
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21446,6 +22390,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 175858
+    server_monotonic_dur: 148750
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21487,6 +22433,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 415888
+    server_monotonic_dur: 388498
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21528,6 +22476,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 374486
+    server_monotonic_dur: 345600
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21566,6 +22516,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 193674
+    server_monotonic_dur: 37550
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21613,6 +22565,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 413246
+    server_monotonic_dur: 387134
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21651,6 +22605,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 80614
+    server_monotonic_dur: 30549
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21695,6 +22651,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 183938
+    server_monotonic_dur: 111509
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21736,6 +22694,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 163824
+    server_monotonic_dur: 122423
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21777,6 +22737,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 301695
+    server_monotonic_dur: 270414
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21818,6 +22780,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 682979
+    server_monotonic_dur: 581920
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21865,6 +22829,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 273575
+    server_monotonic_dur: 249822
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21906,6 +22872,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 178193
+    server_monotonic_dur: 155515
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21947,6 +22915,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 657065
+    server_monotonic_dur: 219503
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -21985,6 +22955,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 567500
+    server_monotonic_dur: 110145
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22032,6 +23004,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1613617
+    server_monotonic_dur: 441040
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22079,6 +23053,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 387992
+    server_monotonic_dur: 333936
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22126,6 +23102,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 384278
+    server_monotonic_dur: 202134
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22173,6 +23151,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 17823806
+    server_monotonic_dur: 16706822
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22232,6 +23212,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 337321
+    server_monotonic_dur: 200530
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22279,6 +23261,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2135944
+    server_monotonic_dur: 1854843
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22338,6 +23322,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 371382
+    server_monotonic_dur: 318768
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22385,6 +23371,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2695236
+    server_monotonic_dur: 2023523
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22444,6 +23432,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2030870
+    server_monotonic_dur: 137432
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22491,6 +23481,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1251625
+    server_monotonic_dur: 614479
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22538,6 +23530,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 554029
+    server_monotonic_dur: 518373
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22585,6 +23579,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 563314
+    server_monotonic_dur: 528137
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22632,6 +23628,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 537780
+    server_monotonic_dur: 502049
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22679,6 +23677,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 519997
+    server_monotonic_dur: 488839
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22726,6 +23726,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 7429344
+    server_monotonic_dur: 583472
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22773,6 +23775,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 238249
+    server_monotonic_dur: 148173
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22820,6 +23824,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 576329
+    server_monotonic_dur: 544045
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22867,6 +23873,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 553742
+    server_monotonic_dur: 517013
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22914,6 +23922,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 535925
+    server_monotonic_dur: 501315
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -22961,6 +23971,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 527836
+    server_monotonic_dur: 493347
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23008,6 +24020,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 539363
+    server_monotonic_dur: 504362
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23055,6 +24069,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 839722
+    server_monotonic_dur: 809700
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23108,6 +24124,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2838780
+    server_monotonic_dur: 498019
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23155,6 +24173,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 746457
+    server_monotonic_dur: 101452
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23202,6 +24222,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 3116296
+    server_monotonic_dur: 494844
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23249,6 +24271,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2397558
+    server_monotonic_dur: 639946
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23296,6 +24320,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2532187
+    server_monotonic_dur: 614273
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23349,6 +24375,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 855776
+    server_monotonic_dur: 826237
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23402,6 +24430,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 517655
+    server_monotonic_dur: 490455
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23449,6 +24479,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 545271
+    server_monotonic_dur: 511925
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23496,6 +24528,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 135146
+    server_monotonic_dur: 107694
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23543,6 +24577,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 517013
+    server_monotonic_dur: 487281
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23590,6 +24626,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 631469
+    server_monotonic_dur: 604122
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23643,6 +24681,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 595074
+    server_monotonic_dur: 571893
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23696,6 +24736,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 552269
+    server_monotonic_dur: 520757
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23743,6 +24785,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 601540
+    server_monotonic_dur: 540479
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23790,6 +24834,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 105149
+    server_monotonic_dur: 80570
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23837,6 +24883,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 243959
+    server_monotonic_dur: 218826
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23884,6 +24932,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 108404
+    server_monotonic_dur: 83945
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23931,6 +24981,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 255772
+    server_monotonic_dur: 229172
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -23978,6 +25030,8 @@
     server_pid: 1469
     server_oom_score: -800
     is_sync: true
+    client_monotonic_dur: 491565
+    server_monotonic_dur: 252231
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24037,6 +25091,8 @@
     server_pid: 1469
     server_oom_score: -800
     is_sync: true
+    client_monotonic_dur: 1359588
+    server_monotonic_dur: 1280511
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24093,6 +25149,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1236290
+    server_monotonic_dur: 199511
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24134,6 +25192,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 299362
+    server_monotonic_dur: 274037
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24175,6 +25235,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 12551268
+    server_monotonic_dur: 12515329
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24231,6 +25293,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 313846
+    server_monotonic_dur: 287526
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24275,6 +25339,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 717354
+    server_monotonic_dur: 334312
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24319,6 +25385,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 7056358
+    server_monotonic_dur: 6980257
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24372,6 +25440,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 17949987
+    server_monotonic_dur: 163732
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24419,6 +25489,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 643839
+    server_monotonic_dur: 541776
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24466,6 +25538,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 444700
+    server_monotonic_dur: 350857
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24513,6 +25587,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2538493
+    server_monotonic_dur: 520350
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24566,6 +25642,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 369653
+    server_monotonic_dur: 234606
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24613,6 +25691,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1614884
+    server_monotonic_dur: 1545396
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24666,6 +25746,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 11137398
+    server_monotonic_dur: 11035265
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24725,6 +25807,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1916997
+    server_monotonic_dur: 1232073
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24784,6 +25868,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 926079
+    server_monotonic_dur: 874193
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24837,6 +25923,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 142621
+    server_monotonic_dur: 117045
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24884,6 +25972,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1356741
+    server_monotonic_dur: 189929
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24931,6 +26021,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 793821
+    server_monotonic_dur: 738381
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -24984,6 +26076,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1026395
+    server_monotonic_dur: 985850
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25031,6 +26125,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 583551
+    server_monotonic_dur: 551136
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25078,6 +26174,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 2755774
+    server_monotonic_dur: 1482290
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25131,6 +26229,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1389739
+    server_monotonic_dur: 1224718
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25190,6 +26290,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 3751733
+    server_monotonic_dur: 512010
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25237,6 +26339,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 813718
+    server_monotonic_dur: 779756
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25296,6 +26400,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 140114
+    server_monotonic_dur: 107070
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25343,6 +26449,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 294281
+    server_monotonic_dur: 262166
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25390,6 +26498,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 264817
+    server_monotonic_dur: 237850
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25437,6 +26547,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 278776
+    server_monotonic_dur: 252571
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25478,6 +26590,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 273809
+    server_monotonic_dur: 248681
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25516,6 +26630,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 226610
+    server_monotonic_dur: 190250
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25557,6 +26673,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 1002924
+    server_monotonic_dur: 694983
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25610,6 +26728,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 602659
+    server_monotonic_dur: 408791
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25657,6 +26777,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 262355
+    server_monotonic_dur: 196958
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25704,6 +26826,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 170144
+    server_monotonic_dur: 131405
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25751,6 +26875,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 609129
+    server_monotonic_dur: 372883
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25798,6 +26924,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: true
+    client_monotonic_dur: 415108
+    server_monotonic_dur: 279772
     client_package_version_code: 33
     is_client_package_debuggable: false
     thread_states {
@@ -25842,6 +26970,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 990711
+    server_monotonic_dur: 18622
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -25878,6 +27008,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36104
+    server_monotonic_dur: 13559
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -25914,6 +27046,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 27199
+    server_monotonic_dur: 7976
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -25950,6 +27084,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36341
+    server_monotonic_dur: 6028
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -25986,6 +27122,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40656
+    server_monotonic_dur: 23849
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26022,6 +27160,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22212
+    server_monotonic_dur: 5868
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26058,6 +27198,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 30414
+    server_monotonic_dur: 13938
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26094,6 +27236,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24759
+    server_monotonic_dur: 8686
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26130,6 +27274,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23926
+    server_monotonic_dur: 7925
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26166,6 +27312,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23860
+    server_monotonic_dur: 7882
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26202,6 +27350,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21382
+    server_monotonic_dur: 5551
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26238,6 +27388,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24790
+    server_monotonic_dur: 6374
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26274,6 +27426,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 29653
+    server_monotonic_dur: 11564
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26310,6 +27464,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21591
+    server_monotonic_dur: 5597
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26346,6 +27502,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21357
+    server_monotonic_dur: 5438
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26382,6 +27540,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24288
+    server_monotonic_dur: 8403
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26418,6 +27578,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1058417
+    server_monotonic_dur: 5670
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -26448,6 +27610,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36616
+    server_monotonic_dur: 12538
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26484,6 +27648,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 28435
+    server_monotonic_dur: 10926
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26520,6 +27686,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22007
+    server_monotonic_dur: 5464
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26556,6 +27724,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24309
+    server_monotonic_dur: 7802
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26592,6 +27762,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21748
+    server_monotonic_dur: 5336
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26628,6 +27800,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24580
+    server_monotonic_dur: 8280
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26664,6 +27838,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23882
+    server_monotonic_dur: 7647
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26700,6 +27876,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21575
+    server_monotonic_dur: 5312
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26736,6 +27914,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21555
+    server_monotonic_dur: 5318
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26772,6 +27952,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 3948088
+    server_monotonic_dur: 20207
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -26814,6 +27996,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 891143
+    server_monotonic_dur: 17713
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26850,6 +28034,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 3043559
+    server_monotonic_dur: 12749
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26886,6 +28072,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 519456
+    server_monotonic_dur: 12923
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26922,6 +28110,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 3450163
+    server_monotonic_dur: 13004
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26958,6 +28148,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 58083
+    server_monotonic_dur: 30493
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -26994,6 +28186,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24489
+    server_monotonic_dur: 6328
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27030,6 +28224,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 47686
+    server_monotonic_dur: 30400
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27066,6 +28262,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 26241
+    server_monotonic_dur: 8926
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27102,6 +28300,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24542
+    server_monotonic_dur: 7961
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27138,6 +28338,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25475
+    server_monotonic_dur: 8311
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27174,6 +28376,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24388
+    server_monotonic_dur: 7868
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27210,6 +28414,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24327
+    server_monotonic_dur: 7956
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27246,6 +28452,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24199
+    server_monotonic_dur: 7843
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27282,6 +28490,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24262
+    server_monotonic_dur: 7953
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27318,6 +28528,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23993
+    server_monotonic_dur: 7691
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27354,6 +28566,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24137
+    server_monotonic_dur: 7797
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27390,6 +28604,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24661
+    server_monotonic_dur: 7720
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27426,6 +28642,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24213
+    server_monotonic_dur: 7862
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27462,6 +28680,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24099
+    server_monotonic_dur: 7736
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27498,6 +28718,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24435
+    server_monotonic_dur: 7906
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27534,6 +28756,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24108
+    server_monotonic_dur: 7730
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27570,6 +28794,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24062
+    server_monotonic_dur: 7740
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27606,6 +28832,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21626
+    server_monotonic_dur: 5345
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27642,6 +28870,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24258
+    server_monotonic_dur: 7879
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27678,6 +28908,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21796
+    server_monotonic_dur: 5274
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27714,6 +28946,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21612
+    server_monotonic_dur: 5227
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27750,6 +28984,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24409
+    server_monotonic_dur: 7945
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -27786,6 +29022,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 21304
+    server_monotonic_dur: 5405
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -27816,6 +29054,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 20650
+    server_monotonic_dur: 5275
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -27846,6 +29086,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23293
+    server_monotonic_dur: 8055
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -27876,6 +29118,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 20415
+    server_monotonic_dur: 5323
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -27906,6 +29150,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23140
+    server_monotonic_dur: 7699
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -27936,6 +29182,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 20312
+    server_monotonic_dur: 5293
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -27966,6 +29214,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22673
+    server_monotonic_dur: 7721
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -27996,6 +29246,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22661
+    server_monotonic_dur: 7740
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -28026,6 +29278,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22659
+    server_monotonic_dur: 7711
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -28056,6 +29310,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22706
+    server_monotonic_dur: 7719
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -28086,6 +29342,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22622
+    server_monotonic_dur: 7628
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -28116,6 +29374,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22726
+    server_monotonic_dur: 7718
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -28146,6 +29406,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22953
+    server_monotonic_dur: 7746
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -28176,6 +29438,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22784
+    server_monotonic_dur: 7712
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -28206,6 +29470,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22691
+    server_monotonic_dur: 7624
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -28236,6 +29502,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 20391
+    server_monotonic_dur: 5308
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -28266,6 +29534,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 20254
+    server_monotonic_dur: 5281
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R+"
@@ -28296,6 +29566,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1322150
+    server_monotonic_dur: 17684
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -28338,6 +29610,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 50949
+    server_monotonic_dur: 14973
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28374,6 +29648,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36821
+    server_monotonic_dur: 9677
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28410,6 +29686,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40517
+    server_monotonic_dur: 10198
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28446,6 +29724,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 38972
+    server_monotonic_dur: 9094
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28482,6 +29762,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 58727
+    server_monotonic_dur: 30654
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28518,6 +29800,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 37895
+    server_monotonic_dur: 9611
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28554,6 +29838,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 70403
+    server_monotonic_dur: 43299
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28590,6 +29876,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40782
+    server_monotonic_dur: 13796
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28626,6 +29914,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39514
+    server_monotonic_dur: 13152
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28662,6 +29952,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39404
+    server_monotonic_dur: 12971
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28698,6 +29990,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39462
+    server_monotonic_dur: 13001
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28734,6 +30028,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39435
+    server_monotonic_dur: 13025
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28770,6 +30066,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39155
+    server_monotonic_dur: 12827
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28806,6 +30104,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39318
+    server_monotonic_dur: 13013
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28842,6 +30142,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40374
+    server_monotonic_dur: 13042
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28878,6 +30180,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39667
+    server_monotonic_dur: 13220
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28914,6 +30218,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39274
+    server_monotonic_dur: 13002
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28950,6 +30256,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39611
+    server_monotonic_dur: 13280
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -28986,6 +30294,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39285
+    server_monotonic_dur: 12883
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29022,6 +30332,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39290
+    server_monotonic_dur: 12995
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29058,6 +30370,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35392
+    server_monotonic_dur: 9048
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29094,6 +30408,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40115
+    server_monotonic_dur: 13177
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29130,6 +30446,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35408
+    server_monotonic_dur: 8864
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29166,6 +30484,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35682
+    server_monotonic_dur: 8910
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29202,6 +30522,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40695
+    server_monotonic_dur: 14086
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29238,6 +30560,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36460
+    server_monotonic_dur: 9138
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29274,6 +30598,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35280
+    server_monotonic_dur: 8765
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29310,6 +30636,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39673
+    server_monotonic_dur: 13221
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29346,6 +30674,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36181
+    server_monotonic_dur: 9064
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29382,6 +30712,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39287
+    server_monotonic_dur: 12919
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29418,6 +30750,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 52115
+    server_monotonic_dur: 9023
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29454,6 +30788,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 69165
+    server_monotonic_dur: 41453
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29490,6 +30826,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41115
+    server_monotonic_dur: 13596
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29526,6 +30864,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39291
+    server_monotonic_dur: 13234
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29562,6 +30902,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 40177
+    server_monotonic_dur: 13349
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29598,6 +30940,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 39543
+    server_monotonic_dur: 13473
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29634,6 +30978,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 38962
+    server_monotonic_dur: 12841
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29670,6 +31016,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35128
+    server_monotonic_dur: 8992
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29706,6 +31054,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35089
+    server_monotonic_dur: 9000
     thread_states {
       thread_state_type: "binder_txn"
       thread_state: "R"
@@ -29742,6 +31092,8 @@
     server_pid: 553
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 55023
+    server_monotonic_dur: 21000
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -29784,6 +31136,8 @@
     server_pid: 243
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 228059900
+    server_monotonic_dur: 228026279
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "D"
@@ -29862,6 +31216,8 @@
     server_pid: 243
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 162681216
+    server_monotonic_dur: 162630809
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "D"
@@ -29940,6 +31296,8 @@
     server_pid: 243
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 20588852
+    server_monotonic_dur: 20538993
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "D"
@@ -30012,6 +31370,8 @@
     server_pid: 243
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 170336
+    server_monotonic_dur: 96466
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30054,6 +31414,8 @@
     server_pid: 243
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 285656
+    server_monotonic_dur: 216457
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30099,6 +31461,8 @@
     server_pid: 557
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 281586
+    server_monotonic_dur: 201375
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30141,6 +31505,8 @@
     server_pid: 243
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 88126
+    server_monotonic_dur: 28600
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30177,6 +31543,8 @@
     server_pid: 243
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1107826416
+    server_monotonic_dur: 1107753554
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "D"
@@ -30267,6 +31635,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 551762
+    server_monotonic_dur: 37934
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30291,6 +31661,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 206755
+    server_monotonic_dur: 99199
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30327,6 +31699,8 @@
     server_pid: 243
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1012632223
+    server_monotonic_dur: 1012458082
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "D"
@@ -30393,6 +31767,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 148055
+    server_monotonic_dur: 67881
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30417,6 +31793,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 199120
+    server_monotonic_dur: 96025
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30453,6 +31831,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 763221
+    server_monotonic_dur: 69071
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30489,6 +31869,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 184045
+    server_monotonic_dur: 66422
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30525,6 +31907,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 4469869
+    server_monotonic_dur: 44047
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30567,6 +31951,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 480108
+    server_monotonic_dur: 49614
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30609,6 +31995,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 2740797
+    server_monotonic_dur: 60621
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30651,6 +32039,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 9261452
+    server_monotonic_dur: 38742
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30693,6 +32083,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 2413332
+    server_monotonic_dur: 29167
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30735,6 +32127,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 303028
+    server_monotonic_dur: 23950
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30777,6 +32171,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 396440
+    server_monotonic_dur: 14784
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30819,6 +32215,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 282912
+    server_monotonic_dur: 46916
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30861,6 +32259,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 26498
+    server_monotonic_dur: 5533
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30903,6 +32303,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23985
+    server_monotonic_dur: 5247
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30945,6 +32347,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23561
+    server_monotonic_dur: 5111
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -30987,6 +32391,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23488
+    server_monotonic_dur: 5124
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31029,6 +32435,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 58807
+    server_monotonic_dur: 25722
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31071,6 +32479,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25853
+    server_monotonic_dur: 5759
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31113,6 +32523,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24395
+    server_monotonic_dur: 5429
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31155,6 +32567,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23577
+    server_monotonic_dur: 5097
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31197,6 +32611,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23326
+    server_monotonic_dur: 5094
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31239,6 +32655,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 41562
+    server_monotonic_dur: 14905
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31281,6 +32699,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24617
+    server_monotonic_dur: 5437
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31323,6 +32743,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23847
+    server_monotonic_dur: 5279
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31365,6 +32787,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23344
+    server_monotonic_dur: 5018
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31407,6 +32831,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23173
+    server_monotonic_dur: 5003
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31449,6 +32875,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 42455
+    server_monotonic_dur: 13643
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31491,6 +32919,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25039
+    server_monotonic_dur: 5879
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31533,6 +32963,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23818
+    server_monotonic_dur: 5210
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31575,6 +33007,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23523
+    server_monotonic_dur: 5250
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31617,6 +33051,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23258
+    server_monotonic_dur: 5179
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31659,6 +33095,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 37686
+    server_monotonic_dur: 12741
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31701,6 +33139,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25076
+    server_monotonic_dur: 5338
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31743,6 +33183,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24170
+    server_monotonic_dur: 5220
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31785,6 +33227,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23285
+    server_monotonic_dur: 5136
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31827,6 +33271,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23121
+    server_monotonic_dur: 5074
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31869,6 +33315,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36446
+    server_monotonic_dur: 11331
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31911,6 +33359,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 216337
+    server_monotonic_dur: 9175
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -31959,6 +33409,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24997
+    server_monotonic_dur: 5134
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32001,6 +33453,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23646
+    server_monotonic_dur: 5045
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32043,6 +33497,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23278
+    server_monotonic_dur: 5008
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32085,6 +33541,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 38383
+    server_monotonic_dur: 11966
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32127,6 +33585,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24444
+    server_monotonic_dur: 5361
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32169,6 +33629,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23624
+    server_monotonic_dur: 5206
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32211,6 +33673,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23411
+    server_monotonic_dur: 5103
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32253,6 +33717,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23200
+    server_monotonic_dur: 5116
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32295,6 +33761,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 37272
+    server_monotonic_dur: 11195
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32337,6 +33805,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24893
+    server_monotonic_dur: 5464
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32379,6 +33849,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23737
+    server_monotonic_dur: 5128
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32421,6 +33893,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23670
+    server_monotonic_dur: 5080
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32463,6 +33937,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23503
+    server_monotonic_dur: 5083
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32505,6 +33981,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35592
+    server_monotonic_dur: 10713
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32547,6 +34025,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24305
+    server_monotonic_dur: 5210
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32589,6 +34069,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23706
+    server_monotonic_dur: 5225
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32631,6 +34113,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23165
+    server_monotonic_dur: 5074
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32673,6 +34157,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23168
+    server_monotonic_dur: 5133
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32715,6 +34201,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35306
+    server_monotonic_dur: 10392
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32757,6 +34245,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24381
+    server_monotonic_dur: 5176
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32799,6 +34289,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23470
+    server_monotonic_dur: 5115
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32841,6 +34333,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23542
+    server_monotonic_dur: 5073
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32883,6 +34377,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23384
+    server_monotonic_dur: 5074
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32925,6 +34421,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35250
+    server_monotonic_dur: 10236
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -32967,6 +34465,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24212
+    server_monotonic_dur: 5302
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33009,6 +34509,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 26668
+    server_monotonic_dur: 5690
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33051,6 +34553,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 28736
+    server_monotonic_dur: 6082
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33093,6 +34597,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 31692
+    server_monotonic_dur: 7457
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33135,6 +34641,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 38639
+    server_monotonic_dur: 11177
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33177,6 +34685,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25645
+    server_monotonic_dur: 5662
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33219,6 +34729,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25248
+    server_monotonic_dur: 5141
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33261,6 +34773,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24407
+    server_monotonic_dur: 5197
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33303,6 +34817,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23761
+    server_monotonic_dur: 5029
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33345,6 +34861,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36661
+    server_monotonic_dur: 10577
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33387,6 +34905,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25064
+    server_monotonic_dur: 5449
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33429,6 +34949,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23437
+    server_monotonic_dur: 5088
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33471,6 +34993,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 27788
+    server_monotonic_dur: 6148
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33513,6 +35037,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 30162
+    server_monotonic_dur: 6377
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33555,6 +35081,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 204333
+    server_monotonic_dur: 10440
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33597,6 +35125,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 28290
+    server_monotonic_dur: 6752
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33639,6 +35169,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23656
+    server_monotonic_dur: 5177
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33681,6 +35213,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23334
+    server_monotonic_dur: 5089
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33723,6 +35257,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23145
+    server_monotonic_dur: 5038
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33765,6 +35301,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35789
+    server_monotonic_dur: 10425
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33807,6 +35345,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24574
+    server_monotonic_dur: 5165
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33849,6 +35389,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23513
+    server_monotonic_dur: 5220
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33891,6 +35433,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23105
+    server_monotonic_dur: 5151
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33933,6 +35477,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 22850
+    server_monotonic_dur: 5061
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -33975,6 +35521,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36067
+    server_monotonic_dur: 11134
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34017,6 +35565,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24738
+    server_monotonic_dur: 5151
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34059,6 +35609,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23608
+    server_monotonic_dur: 5033
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34101,6 +35653,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23348
+    server_monotonic_dur: 5000
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34143,6 +35697,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23149
+    server_monotonic_dur: 4962
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34185,6 +35741,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 34410
+    server_monotonic_dur: 9921
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34227,6 +35785,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25022
+    server_monotonic_dur: 5372
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34269,6 +35829,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23533
+    server_monotonic_dur: 5067
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34311,6 +35873,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23334
+    server_monotonic_dur: 5004
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34353,6 +35917,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23264
+    server_monotonic_dur: 5062
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34395,6 +35961,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 37797
+    server_monotonic_dur: 11210
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34437,6 +36005,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24457
+    server_monotonic_dur: 5311
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34479,6 +36049,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23691
+    server_monotonic_dur: 5120
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34521,6 +36093,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23600
+    server_monotonic_dur: 5195
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34563,6 +36137,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23223
+    server_monotonic_dur: 5022
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34605,6 +36181,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24971
+    server_monotonic_dur: 5779
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34647,6 +36225,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23811
+    server_monotonic_dur: 5064
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34689,6 +36269,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23366
+    server_monotonic_dur: 5050
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34731,6 +36313,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36875
+    server_monotonic_dur: 5970
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34773,6 +36357,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23299
+    server_monotonic_dur: 5177
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34815,6 +36401,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23580
+    server_monotonic_dur: 5233
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34857,6 +36445,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23357
+    server_monotonic_dur: 5118
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34899,6 +36489,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23287
+    server_monotonic_dur: 5230
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34941,6 +36533,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23143
+    server_monotonic_dur: 5080
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -34983,6 +36577,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23644
+    server_monotonic_dur: 5056
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35025,6 +36621,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23543
+    server_monotonic_dur: 5145
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35067,6 +36665,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23143
+    server_monotonic_dur: 5048
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35109,6 +36709,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23084
+    server_monotonic_dur: 5059
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35151,6 +36753,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23140
+    server_monotonic_dur: 5047
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35193,6 +36797,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23089
+    server_monotonic_dur: 5027
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35235,6 +36841,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35357
+    server_monotonic_dur: 10429
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35277,6 +36885,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 88269
+    server_monotonic_dur: 5241
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35319,6 +36929,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24809
+    server_monotonic_dur: 5666
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35361,6 +36973,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23697
+    server_monotonic_dur: 5217
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35403,6 +37017,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23663
+    server_monotonic_dur: 5052
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35445,6 +37061,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 25870
+    server_monotonic_dur: 5746
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35487,6 +37105,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23258
+    server_monotonic_dur: 5107
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35529,6 +37149,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 150443
+    server_monotonic_dur: 5613
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35565,6 +37187,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24180
+    server_monotonic_dur: 5626
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35607,6 +37231,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 34839
+    server_monotonic_dur: 5193
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35649,6 +37275,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 33346
+    server_monotonic_dur: 9340
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35691,6 +37319,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23777
+    server_monotonic_dur: 5140
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35733,6 +37363,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23389
+    server_monotonic_dur: 5100
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35775,6 +37407,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23142
+    server_monotonic_dur: 5086
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35817,6 +37451,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23125
+    server_monotonic_dur: 5089
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35859,6 +37495,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23978
+    server_monotonic_dur: 5383
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35901,6 +37539,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23179
+    server_monotonic_dur: 5138
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35943,6 +37583,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 26831
+    server_monotonic_dur: 5902
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -35985,6 +37627,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 29437
+    server_monotonic_dur: 6174
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36027,6 +37671,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 30978
+    server_monotonic_dur: 6742
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36069,6 +37715,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 27467
+    server_monotonic_dur: 6461
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36111,6 +37759,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23777
+    server_monotonic_dur: 5275
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36153,6 +37803,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23185
+    server_monotonic_dur: 5108
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36195,6 +37847,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23203
+    server_monotonic_dur: 5092
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36237,6 +37891,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23347
+    server_monotonic_dur: 5253
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36279,6 +37935,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 7978157
+    server_monotonic_dur: 66962
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "R"
@@ -36321,6 +37979,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 34814
+    server_monotonic_dur: 9528
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36363,6 +38023,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24308
+    server_monotonic_dur: 5289
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36405,6 +38067,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23448
+    server_monotonic_dur: 5073
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36447,6 +38111,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23421
+    server_monotonic_dur: 5046
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36489,6 +38155,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1913216
+    server_monotonic_dur: 9871
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36531,6 +38199,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 34454
+    server_monotonic_dur: 9275
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36573,6 +38243,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24416
+    server_monotonic_dur: 5102
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36615,6 +38287,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23679
+    server_monotonic_dur: 5243
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36657,6 +38331,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23222
+    server_monotonic_dur: 5090
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36699,6 +38375,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 5056885
+    server_monotonic_dur: 9349
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36741,6 +38419,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 33923
+    server_monotonic_dur: 9115
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36783,6 +38463,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23704
+    server_monotonic_dur: 5092
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36825,6 +38507,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23336
+    server_monotonic_dur: 5061
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36867,6 +38551,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23099
+    server_monotonic_dur: 4992
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36909,6 +38595,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 11032023
+    server_monotonic_dur: 9668
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36951,6 +38639,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 34577
+    server_monotonic_dur: 8880
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -36993,6 +38683,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23881
+    server_monotonic_dur: 5076
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37035,6 +38727,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23603
+    server_monotonic_dur: 5316
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37077,6 +38771,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23285
+    server_monotonic_dur: 5074
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37119,6 +38815,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 36911
+    server_monotonic_dur: 9735
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37161,6 +38859,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24626
+    server_monotonic_dur: 5361
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37203,6 +38903,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23589
+    server_monotonic_dur: 5097
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37245,6 +38947,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23634
+    server_monotonic_dur: 5011
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37287,6 +38991,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23394
+    server_monotonic_dur: 5235
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37329,6 +39035,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 8989871
+    server_monotonic_dur: 9601
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37371,6 +39079,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 35638
+    server_monotonic_dur: 8905
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37413,6 +39123,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 24171
+    server_monotonic_dur: 5233
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37455,6 +39167,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23967
+    server_monotonic_dur: 5113
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37497,6 +39211,8 @@
     server_pid: 447
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 23205
+    server_monotonic_dur: 5070
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37539,6 +39255,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 163113
+    server_monotonic_dur: 46170
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37575,6 +39293,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 3407477
+    server_monotonic_dur: 93276
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37617,6 +39337,8 @@
     server_pid: 256
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 408373
+    server_monotonic_dur: 126182
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37659,6 +39381,8 @@
     server_pid: 256
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 74407
+    server_monotonic_dur: 27462
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37695,6 +39419,8 @@
     server_pid: 256
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 253419
+    server_monotonic_dur: 62308
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37731,6 +39457,8 @@
     server_pid: 256
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 27262
+    server_monotonic_dur: 6839
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37767,6 +39495,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 566849
+    server_monotonic_dur: 42126
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37803,6 +39533,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 640620
+    server_monotonic_dur: 59362
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37845,6 +39577,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 67172
+    server_monotonic_dur: 25498
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37884,6 +39618,8 @@
     server_pid: 550
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1832306
+    server_monotonic_dur: 1612156
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37926,6 +39662,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 96979
+    server_monotonic_dur: 36676
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37962,6 +39700,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 96212
+    server_monotonic_dur: 34204
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -37998,6 +39738,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 85847
+    server_monotonic_dur: 34883
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -38034,6 +39776,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 623581
+    server_monotonic_dur: 30144
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -38076,6 +39820,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 290505
+    server_monotonic_dur: 30338
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -38118,6 +39864,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 876817
+    server_monotonic_dur: 30724
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -38163,6 +39911,8 @@
     server_pid: 550
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 2881392
+    server_monotonic_dur: 1064925
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -38199,6 +39949,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 117266
+    server_monotonic_dur: 28273
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -38241,6 +39993,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 1595172
+    server_monotonic_dur: 27543
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -38283,6 +40037,8 @@
     server_pid: 226
     server_oom_score: -1000
     is_sync: true
+    client_monotonic_dur: 2090082
+    server_monotonic_dur: 29214
     thread_states {
       thread_state_type: "binder_reply"
       thread_state: "Running"
@@ -38328,6 +40084,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IPermissionManager::getPermissionInfo::server"
@@ -38349,6 +40107,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38372,6 +40132,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38395,6 +40157,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeInternalPathChanged::server"
@@ -38416,6 +40180,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumePathChanged::server"
@@ -38437,6 +40203,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "com.android.providers.media.module"
@@ -38455,6 +40223,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38478,6 +40248,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::INotificationManager::cancelNotificationWithTag::server"
@@ -38499,6 +40271,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38522,6 +40296,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38545,6 +40321,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38568,6 +40346,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38591,6 +40371,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38614,6 +40396,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38637,6 +40421,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38660,6 +40446,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38680,6 +40468,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38703,6 +40493,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUserManager::getProfileIds::server"
@@ -38724,6 +40516,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38747,6 +40541,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38770,6 +40566,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38793,6 +40591,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38816,6 +40616,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38839,6 +40641,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38862,6 +40666,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38885,6 +40691,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IActivityManager::finishReceiver::server"
@@ -38906,6 +40714,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IActivityManager::finishReceiver::server"
@@ -38927,6 +40737,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -38950,6 +40762,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -38971,6 +40785,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -38992,6 +40808,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39010,6 +40828,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39028,6 +40848,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39049,6 +40871,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39070,6 +40894,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39091,6 +40917,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39112,6 +40940,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39133,6 +40963,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39154,6 +40986,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39175,6 +41009,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39196,6 +41032,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39217,6 +41055,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -39238,6 +41078,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -39259,6 +41101,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39280,6 +41124,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -39301,6 +41147,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -39322,6 +41170,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39340,6 +41190,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39358,6 +41210,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39376,6 +41230,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39394,6 +41250,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39412,6 +41270,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39433,6 +41293,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39454,6 +41316,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39475,6 +41339,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39496,6 +41362,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39517,6 +41385,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39538,6 +41408,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39559,6 +41431,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39580,6 +41454,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39601,6 +41477,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39622,6 +41500,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39643,6 +41523,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39661,6 +41543,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39679,6 +41563,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39697,6 +41583,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39715,6 +41603,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39733,6 +41623,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39751,6 +41643,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39769,6 +41663,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39787,6 +41683,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39805,6 +41703,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39823,6 +41723,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39841,6 +41743,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39859,6 +41763,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39877,6 +41783,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39895,6 +41803,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39913,6 +41823,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39931,6 +41843,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39949,6 +41863,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39967,6 +41883,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -39985,6 +41903,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40003,6 +41923,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40021,6 +41943,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40039,6 +41963,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40057,6 +41983,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40075,6 +42003,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40093,6 +42023,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40111,6 +42043,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40129,6 +42063,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40147,6 +42083,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40165,6 +42103,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40183,6 +42123,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40201,6 +42143,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40219,6 +42163,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40237,6 +42183,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40255,6 +42203,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40273,6 +42223,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40291,6 +42243,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40309,6 +42263,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40327,6 +42283,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40345,6 +42303,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40363,6 +42323,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40381,6 +42343,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40399,6 +42363,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40417,6 +42383,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40435,6 +42403,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40453,6 +42423,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40471,6 +42443,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40489,6 +42463,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40507,6 +42483,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40525,6 +42503,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40543,6 +42523,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40561,6 +42543,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40579,6 +42563,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40597,6 +42583,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40615,6 +42603,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40633,6 +42623,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40651,6 +42643,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40669,6 +42663,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40687,6 +42683,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40705,6 +42703,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40723,6 +42723,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40741,6 +42743,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40759,6 +42763,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40777,6 +42783,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40795,6 +42803,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40813,6 +42823,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40831,6 +42843,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40849,6 +42863,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40867,6 +42883,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -40885,6 +42903,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -40906,6 +42926,8 @@
     server_pid: 1937
     server_oom_score: 925
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -40927,6 +42949,8 @@
     server_pid: 1866
     server_oom_score: 955
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -40948,6 +42972,8 @@
     server_pid: 2003
     server_oom_score: 965
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -40969,6 +42995,8 @@
     server_pid: 2003
     server_oom_score: 0
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -40990,6 +43018,8 @@
     server_pid: 2003
     server_oom_score: 905
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -41011,6 +43041,8 @@
     server_pid: 2003
     server_oom_score: 0
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -41032,6 +43064,8 @@
     server_pid: 2003
     server_oom_score: 905
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41050,6 +43084,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41068,6 +43104,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41085,6 +43123,8 @@
     server_tid: 3484
     server_pid: 3482
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleRegisteredReceiver::server"
@@ -41106,6 +43146,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IRemoteSessionCallback::onSessionChanged::server"
@@ -41127,6 +43169,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41145,6 +43189,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -41166,6 +43212,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -41187,6 +43235,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -41208,6 +43258,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -41229,6 +43281,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleRegisteredReceiver::server"
@@ -41250,6 +43304,8 @@
     server_pid: 1469
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleRegisteredReceiver::server"
@@ -41271,6 +43327,8 @@
     server_pid: 1469
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleRegisteredReceiver::server"
@@ -41292,6 +43350,8 @@
     server_pid: 1469
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -41313,6 +43373,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IActivityManager::serviceDoneExecuting::server"
@@ -41334,6 +43396,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -41354,6 +43418,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41372,6 +43438,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41390,6 +43458,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41408,6 +43478,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41426,6 +43498,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41444,6 +43518,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41462,6 +43538,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41480,6 +43558,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41498,6 +43578,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41516,6 +43598,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41534,6 +43618,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41552,6 +43638,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41570,6 +43658,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41588,6 +43678,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41606,6 +43698,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41624,6 +43718,8 @@
     server_pid: 256
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41642,6 +43738,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -41660,6 +43758,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onDiskScanned::server"
@@ -41681,6 +43781,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IPhoneStateListener::onSignalStrengthsChanged::server"
@@ -41702,6 +43804,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -41723,6 +43827,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::INotificationListener::onNotificationRemoved::server"
@@ -41744,6 +43850,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -41762,6 +43870,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -41780,6 +43890,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -41798,6 +43910,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IPackageManager::notifyDexLoad::server"
@@ -41819,6 +43933,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -41842,6 +43958,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStatsManagerService::registerPullAtomCallback::server"
@@ -41863,6 +43981,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -41886,6 +44006,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -41909,6 +44031,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -41929,6 +44053,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -41952,6 +44078,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -41973,6 +44101,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -41994,6 +44124,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeDestroyed::server"
@@ -42015,6 +44147,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -42036,6 +44170,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeDestroyed::server"
@@ -42057,6 +44193,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onDiskDestroyed::server"
@@ -42078,6 +44216,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onDiskCreated::server"
@@ -42099,6 +44239,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onDiskMetadataChanged::server"
@@ -42120,6 +44262,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeCreated::server"
@@ -42141,6 +44285,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -42162,6 +44308,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onDiskScanned::server"
@@ -42183,6 +44331,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeCreated::server"
@@ -42204,6 +44354,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -42225,6 +44377,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -42246,6 +44400,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageManager::getVolumeList::server"
@@ -42267,6 +44423,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42290,6 +44448,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42313,6 +44473,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42336,6 +44498,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumeInternalPathChanged::server"
@@ -42357,6 +44521,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IVoldListener::onVolumePathChanged::server"
@@ -42378,6 +44544,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IActivityManager::finishReceiver::server"
@@ -42399,6 +44567,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42422,6 +44592,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42445,6 +44617,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42468,6 +44642,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42491,6 +44667,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42514,6 +44692,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42537,6 +44717,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42560,6 +44742,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42583,6 +44767,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42606,6 +44792,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42629,6 +44817,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42652,6 +44842,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42675,6 +44867,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42698,6 +44892,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42721,6 +44917,8 @@
     server_pid: 642
     server_oom_score: -900
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -42744,6 +44942,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -42765,6 +44965,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -42786,6 +44988,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -42807,6 +45011,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -42828,6 +45034,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -42849,6 +45057,8 @@
     server_pid: 1441
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::bindApplication::server"
@@ -42870,6 +45080,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -42891,6 +45103,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleCreateService::server"
@@ -42912,6 +45126,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleBindService::server"
@@ -42933,6 +45149,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -42954,6 +45172,8 @@
     server_pid: 3487
     server_oom_score: 0
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onDiskScanned::server"
@@ -42975,6 +45195,8 @@
     server_pid: 3487
     server_oom_score: 905
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -42996,6 +45218,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleCreateService::server"
@@ -43017,6 +45241,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleBindService::server"
@@ -43038,6 +45264,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -43059,6 +45287,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43080,6 +45310,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -43101,6 +45333,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -43122,6 +45356,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -43143,6 +45379,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IExternalStorageService::startSession::server"
@@ -43164,6 +45402,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -43185,6 +45425,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43206,6 +45448,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IExternalStorageService::startSession::server"
@@ -43227,6 +45471,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -43248,6 +45494,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43269,6 +45517,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -43290,6 +45540,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43311,6 +45563,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -43332,6 +45586,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IJobService::startJob::server"
@@ -43353,6 +45609,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43374,6 +45632,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -43395,6 +45655,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -43416,6 +45678,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43437,6 +45701,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -43458,6 +45724,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IExternalStorageService::endSession::server"
@@ -43479,6 +45747,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IExternalStorageService::endSession::server"
@@ -43500,6 +45770,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleUnbindService::server"
@@ -43521,6 +45793,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleStopService::server"
@@ -43542,6 +45816,8 @@
     server_pid: 3487
     server_oom_score: 0
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -43563,6 +45839,8 @@
     server_pid: 3487
     server_oom_score: 0
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -43584,6 +45862,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleCreateService::server"
@@ -43605,6 +45885,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleBindService::server"
@@ -43626,6 +45908,8 @@
     server_pid: 3487
     server_oom_score: -700
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IMediaMetricsService::submitBuffer::cppServer"
@@ -43647,6 +45931,8 @@
     server_pid: 552
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -43670,6 +45956,8 @@
     server_pid: 552
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -43693,6 +45981,8 @@
     server_pid: 552
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IMediaMetricsService::submitBuffer::cppServer"
@@ -43714,6 +46004,8 @@
     server_pid: 552
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IMediaMetricsService::submitBuffer::cppServer"
@@ -43735,6 +46027,8 @@
     server_pid: 552
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -43753,6 +46047,8 @@
     server_pid: 398
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -43771,6 +46067,8 @@
     server_pid: 398
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -43792,6 +46090,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -43812,6 +46112,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -43830,6 +46132,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -43848,6 +46152,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -43866,6 +46172,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -43884,6 +46192,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -43902,6 +46212,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -43923,6 +46235,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -43943,6 +46257,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -43964,6 +46280,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -43984,6 +46302,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "com.android.systemui"
@@ -44002,6 +46322,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44025,6 +46347,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44045,6 +46369,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44066,6 +46392,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44086,6 +46414,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44106,6 +46436,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44127,6 +46459,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44147,6 +46481,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44167,6 +46503,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44188,6 +46526,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44208,6 +46548,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44228,6 +46570,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44249,6 +46593,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44269,6 +46615,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44290,6 +46638,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44310,6 +46660,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44331,6 +46683,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44351,6 +46705,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44369,6 +46725,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44387,6 +46745,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44405,6 +46765,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44426,6 +46788,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44446,6 +46810,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44464,6 +46830,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44482,6 +46850,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44503,6 +46873,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44523,6 +46895,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44541,6 +46915,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44559,6 +46935,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44580,6 +46958,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44603,6 +46983,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44623,6 +47005,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44646,6 +47030,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44669,6 +47055,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44689,6 +47077,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44710,6 +47100,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44730,6 +47122,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44751,6 +47145,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44771,6 +47167,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44792,6 +47190,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44812,6 +47212,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44832,6 +47234,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44853,6 +47257,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44873,6 +47279,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "com.android.systemui"
@@ -44891,6 +47299,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44914,6 +47324,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44934,6 +47346,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44954,6 +47368,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44975,6 +47391,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -44995,6 +47413,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -45015,6 +47435,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -45036,6 +47458,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -45056,6 +47480,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -45076,6 +47502,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -45097,6 +47525,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -45117,6 +47547,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -45137,6 +47569,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -45158,6 +47592,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -45178,6 +47614,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -45198,6 +47636,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -45219,6 +47659,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -45239,6 +47681,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -45259,6 +47703,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -45280,6 +47726,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -45300,6 +47748,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45318,6 +47768,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45336,6 +47788,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45354,6 +47808,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45372,6 +47828,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45390,6 +47848,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45408,6 +47868,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45426,6 +47888,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45444,6 +47908,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45462,6 +47928,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45480,6 +47948,8 @@
     server_pid: 476
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/apex/com.google.cf.rild/bin/hw/libcuttlefish-rild"
@@ -45498,6 +47968,8 @@
     server_pid: 1469
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IPhoneStateListener::onSignalStrengthsChanged::server"
@@ -45519,6 +47991,8 @@
     server_pid: 1469
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::INotificationListener::onNotificationRemoved::server"
@@ -45540,6 +48014,8 @@
     server_pid: 1734
     server_oom_score: 100
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::INotificationListener::onNotificationEnqueuedWithChannel::server"
@@ -45561,6 +48037,8 @@
     server_pid: 1734
     server_oom_score: 100
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::INotificationListener::onNotificationEnqueuedWithChannel::server"
@@ -45582,6 +48060,8 @@
     server_pid: 1734
     server_oom_score: 100
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::INotificationListener::onNotificationPosted::server"
@@ -45603,6 +48083,8 @@
     server_pid: 1734
     server_oom_score: 100
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::INotificationListener::onNotificationPosted::server"
@@ -45624,6 +48106,8 @@
     server_pid: 1734
     server_oom_score: 100
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -45642,6 +48126,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45660,6 +48146,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45678,6 +48166,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45696,6 +48186,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45714,6 +48206,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45732,6 +48226,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45750,6 +48246,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45768,6 +48266,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -45786,6 +48286,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45804,6 +48306,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45822,6 +48326,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45840,6 +48346,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45858,6 +48366,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45876,6 +48386,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45894,6 +48406,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45912,6 +48426,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45930,6 +48446,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45948,6 +48466,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45966,6 +48486,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -45984,6 +48506,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46002,6 +48526,8 @@
     server_pid: 459
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "com.android.systemui"
@@ -46020,6 +48546,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -46040,6 +48568,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -46060,6 +48590,8 @@
     server_pid: 484
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
     client_package_version_code: 33
     is_client_package_debuggable: false
   }
@@ -46080,6 +48612,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -46098,6 +48632,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -46116,6 +48652,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -46134,6 +48672,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -46155,6 +48695,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -46176,6 +48718,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -46197,6 +48741,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -46218,6 +48764,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -46239,6 +48787,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::INotificationListener::onNotificationPosted::server"
@@ -46260,6 +48810,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::INotificationListener::onNotificationPosted::server"
@@ -46281,6 +48833,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -46299,6 +48853,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -46317,6 +48873,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -46335,6 +48893,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -46353,6 +48913,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -46371,6 +48933,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -46389,6 +48953,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "/system/bin/surfaceflinger"
@@ -46407,6 +48973,8 @@
     server_pid: 1253
     server_oom_score: -800
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::bindApplication::server"
@@ -46428,6 +48996,8 @@
     server_pid: 3549
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -46449,6 +49019,8 @@
     server_pid: 3549
     server_oom_score: 0
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -46470,6 +49042,8 @@
     server_pid: 3549
     server_oom_score: 0
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -46491,6 +49065,8 @@
     server_pid: 3549
     server_oom_score: 0
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -46512,6 +49088,8 @@
     server_pid: 3549
     server_oom_score: 905
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -46533,6 +49111,8 @@
     server_pid: 3549
     server_oom_score: 0
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -46554,6 +49134,8 @@
     server_pid: 3549
     server_oom_score: 905
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46572,6 +49154,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46590,6 +49174,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46608,6 +49194,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46626,6 +49214,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46644,6 +49234,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46662,6 +49254,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46680,6 +49274,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46698,6 +49294,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46716,6 +49314,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46734,6 +49334,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46752,6 +49354,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46770,6 +49374,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46788,6 +49394,8 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
   unaggregated_txn_breakdown {
     client_process: "system_server"
@@ -46806,5 +49414,7 @@
     server_pid: 534
     server_oom_score: -1000
     is_sync: false
+    client_monotonic_dur: 0
+    server_monotonic_dur: 0
   }
 }
diff --git a/test/trace_processor/diff_tests/metrics/android/android_monitor_contention.out b/test/trace_processor/diff_tests/metrics/android/android_monitor_contention.out
index 43cf561..0fc97f3 100644
--- a/test/trace_processor/diff_tests/metrics/android/android_monitor_contention.out
+++ b/test/trace_processor/diff_tests/metrics/android/android_monitor_contention.out
@@ -3,6 +3,7 @@
     node_id: 15061
     ts: 1740012196981
     dur: 235531
+    monotonic_dur: 235531
     blocking_method: "android.content.pm.UserInfo com.android.server.pm.UserManagerService.getUserInfoNoChecks(int)"
     blocked_method: "android.content.pm.UserInfo com.android.server.pm.UserManagerService.getUserInfoNoChecks(int)"
     short_blocking_method: "com.android.server.pm.UserManagerService.getUserInfoNoChecks"
@@ -40,6 +41,7 @@
     node_id: 2055
     ts: 1737223735202
     dur: 40111
+    monotonic_dur: 40111
     blocking_method: "android.os.Message android.os.MessageQueue.next()"
     blocked_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     short_blocking_method: "android.os.MessageQueue.next"
@@ -70,6 +72,7 @@
     node_id: 1958
     ts: 1737221139743
     dur: 4232
+    monotonic_dur: 4232
     blocking_method: "android.os.Message android.os.MessageQueue.next()"
     blocked_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     short_blocking_method: "android.os.MessageQueue.next"
@@ -100,6 +103,7 @@
     node_id: 14623
     ts: 1739982673132
     dur: 2750652
+    monotonic_dur: 2750652
     blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
     blocked_method: "android.os.storage.VolumeInfo[] com.android.server.StorageManagerService.getVolumes(int)"
     short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -120,6 +124,7 @@
     node_id: 13975
     ts: 1739942269308
     dur: 2165740
+    monotonic_dur: 2165740
     blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
     blocked_method: "android.os.storage.VolumeRecord[] com.android.server.StorageManagerService.getVolumeRecords(int)"
     short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -140,6 +145,7 @@
     node_id: 14626
     ts: 1739982812646
     dur: 943658
+    monotonic_dur: 943658
     blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
     blocked_method: "android.os.storage.VolumeRecord[] com.android.server.StorageManagerService.getVolumeRecords(int)"
     short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -162,6 +168,7 @@
     node_id: 14617
     ts: 1739982085531
     dur: 1188242
+    monotonic_dur: 1188242
     blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
     blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
     short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -194,6 +201,7 @@
     node_id: 15248
     ts: 1740024214050
     dur: 228088
+    monotonic_dur: 228088
     blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
     blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
     short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -226,6 +234,7 @@
     node_id: 13979
     ts: 1739942426827
     dur: 23842
+    monotonic_dur: 23842
     blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
     blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
     short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -246,6 +255,7 @@
     node_id: 14636
     ts: 1739983492768
     dur: 388360
+    monotonic_dur: 388360
     blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
     blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
     short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -266,6 +276,7 @@
     node_id: 14807
     ts: 1739997641827
     dur: 602533
+    monotonic_dur: 602533
     blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
     blocked_method: "boolean com.android.server.StorageManagerService.isUserKeyUnlocked(int)"
     short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -296,6 +307,7 @@
     node_id: 14619
     ts: 1739982249023
     dur: 2051396
+    monotonic_dur: 2051396
     blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
     blocked_method: "boolean com.android.server.StorageManagerService.isUserKeyUnlocked(int)"
     short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -316,6 +328,7 @@
     node_id: 825
     ts: 1737095066875
     dur: 13553568
+    monotonic_dur: 13553568
     blocking_method: "android.util.Pair com.android.server.am.ProcessList.getNumForegroundServices()"
     blocked_method: "void com.android.server.am.ActivityManagerService.trimApplications(boolean, java.lang.String)"
     short_blocking_method: "com.android.server.am.ProcessList.getNumForegroundServices"
@@ -336,6 +349,7 @@
     node_id: 1072
     ts: 1737134918767
     dur: 201813
+    monotonic_dur: 201813
     blocking_method: "android.util.StatsEvent$Buffer android.util.StatsEvent$Buffer.obtain()"
     blocked_method: "android.util.StatsEvent$Buffer android.util.StatsEvent$Buffer.obtain()"
     short_blocking_method: "android.util.StatsEvent$Buffer.obtain"
@@ -371,6 +385,7 @@
     node_id: 20510
     ts: 1740245849475
     dur: 101011
+    monotonic_dur: 101011
     blocking_method: "boolean android.content.res.AssetManager.getResourceValue(int, int, android.util.TypedValue, boolean)"
     blocked_method: "void android.content.res.AssetManager.applyStyle(long, int, int, android.content.res.XmlBlock$Parser, int[], long, long)"
     short_blocking_method: "android.content.res.AssetManager.getResourceValue"
@@ -396,6 +411,7 @@
     node_id: 2609
     ts: 1737298460334
     dur: 21850
+    monotonic_dur: 21850
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -426,6 +442,7 @@
     node_id: 2612
     ts: 1737298572141
     dur: 18243
+    monotonic_dur: 18243
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -456,6 +473,7 @@
     node_id: 2615
     ts: 1737298649475
     dur: 16545
+    monotonic_dur: 16545
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -486,6 +504,7 @@
     node_id: 2618
     ts: 1737298721765
     dur: 16357
+    monotonic_dur: 16357
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -516,6 +535,7 @@
     node_id: 2621
     ts: 1737298793731
     dur: 16482
+    monotonic_dur: 16482
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -546,6 +566,7 @@
     node_id: 2624
     ts: 1737298865961
     dur: 16788
+    monotonic_dur: 16788
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -576,6 +597,7 @@
     node_id: 2627
     ts: 1737298938587
     dur: 16125
+    monotonic_dur: 16125
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -606,6 +628,7 @@
     node_id: 2630
     ts: 1737299010537
     dur: 51638
+    monotonic_dur: 51638
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -636,6 +659,7 @@
     node_id: 2633
     ts: 1737299130928
     dur: 18041
+    monotonic_dur: 18041
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -666,6 +690,7 @@
     node_id: 2636
     ts: 1737299208715
     dur: 17654
+    monotonic_dur: 17654
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -696,6 +721,7 @@
     node_id: 2639
     ts: 1737299285037
     dur: 16998
+    monotonic_dur: 16998
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -726,6 +752,7 @@
     node_id: 2642
     ts: 1737299360895
     dur: 16885
+    monotonic_dur: 16885
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -756,6 +783,7 @@
     node_id: 2645
     ts: 1737299435615
     dur: 16757
+    monotonic_dur: 16757
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -786,6 +814,7 @@
     node_id: 2648
     ts: 1737299510601
     dur: 16754
+    monotonic_dur: 16754
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -816,6 +845,7 @@
     node_id: 2651
     ts: 1737299585305
     dur: 17797
+    monotonic_dur: 17797
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -846,6 +876,7 @@
     node_id: 2654
     ts: 1737299665374
     dur: 16561
+    monotonic_dur: 16561
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -876,6 +907,7 @@
     node_id: 4018
     ts: 1737341481517
     dur: 21671
+    monotonic_dur: 21671
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -896,6 +928,7 @@
     node_id: 5765
     ts: 1737789462809
     dur: 20680
+    monotonic_dur: 20680
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -926,6 +959,7 @@
     node_id: 5771
     ts: 1737789939928
     dur: 19832
+    monotonic_dur: 19832
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -956,6 +990,7 @@
     node_id: 1287
     ts: 1737161170809
     dur: 21040
+    monotonic_dur: 21040
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -986,6 +1021,7 @@
     node_id: 19861
     ts: 1740196222141
     dur: 8261093
+    monotonic_dur: 8261093
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1016,6 +1052,7 @@
     node_id: 20059
     ts: 1740215659279
     dur: 21393
+    monotonic_dur: 21393
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1046,6 +1083,7 @@
     node_id: 20146
     ts: 1740226983261
     dur: 405233
+    monotonic_dur: 405233
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1076,6 +1114,7 @@
     node_id: 20475
     ts: 1740243405187
     dur: 21177
+    monotonic_dur: 21177
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1106,6 +1145,7 @@
     node_id: 16010
     ts: 1740079340528
     dur: 24052
+    monotonic_dur: 24052
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1136,6 +1176,7 @@
     node_id: 16028
     ts: 1740080203227
     dur: 21678
+    monotonic_dur: 21678
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1166,6 +1207,7 @@
     node_id: 16039
     ts: 1740086095611
     dur: 22424
+    monotonic_dur: 22424
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1196,6 +1238,7 @@
     node_id: 16044
     ts: 1740087510600
     dur: 22032
+    monotonic_dur: 22032
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1226,6 +1269,7 @@
     node_id: 16046
     ts: 1740088505321
     dur: 21783
+    monotonic_dur: 21783
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1256,6 +1300,7 @@
     node_id: 16052
     ts: 1740090099371
     dur: 22117
+    monotonic_dur: 22117
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1286,6 +1331,7 @@
     node_id: 16072
     ts: 1740093579424
     dur: 22973
+    monotonic_dur: 22973
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1316,6 +1362,7 @@
     node_id: 16074
     ts: 1740094332387
     dur: 22001
+    monotonic_dur: 22001
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1346,6 +1393,7 @@
     node_id: 16094
     ts: 1740096040883
     dur: 24390
+    monotonic_dur: 24390
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1376,6 +1424,7 @@
     node_id: 19693
     ts: 1740166145283
     dur: 4220029
+    monotonic_dur: 4220029
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1406,6 +1455,7 @@
     node_id: 19721
     ts: 1740171864902
     dur: 1480141
+    monotonic_dur: 1480141
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1436,6 +1486,7 @@
     node_id: 19737
     ts: 1740174355596
     dur: 6989578
+    monotonic_dur: 6989578
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1466,6 +1517,7 @@
     node_id: 11025
     ts: 1738862386263
     dur: 65791
+    monotonic_dur: 65791
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1496,6 +1548,7 @@
     node_id: 1402
     ts: 1737166624155
     dur: 19365
+    monotonic_dur: 19365
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1526,6 +1579,7 @@
     node_id: 1407
     ts: 1737166746264
     dur: 17318
+    monotonic_dur: 17318
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1556,6 +1610,7 @@
     node_id: 1412
     ts: 1737166849465
     dur: 17295
+    monotonic_dur: 17295
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1586,6 +1641,7 @@
     node_id: 1417
     ts: 1737166949809
     dur: 17047
+    monotonic_dur: 17047
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1616,6 +1672,7 @@
     node_id: 1422
     ts: 1737167048878
     dur: 16995
+    monotonic_dur: 16995
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1646,6 +1703,7 @@
     node_id: 1427
     ts: 1737167147508
     dur: 16908
+    monotonic_dur: 16908
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1676,6 +1734,7 @@
     node_id: 230
     ts: 1737051866140
     dur: 45214
+    monotonic_dur: 45214
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1706,6 +1765,7 @@
     node_id: 329
     ts: 1737063671723
     dur: 37395
+    monotonic_dur: 37395
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1726,6 +1786,7 @@
     node_id: 333
     ts: 1737064791138
     dur: 39671
+    monotonic_dur: 39671
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1746,6 +1807,7 @@
     node_id: 423
     ts: 1737079706338
     dur: 422780
+    monotonic_dur: 422780
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1766,6 +1828,7 @@
     node_id: 536
     ts: 1737083097868
     dur: 418004
+    monotonic_dur: 418004
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1786,6 +1849,7 @@
     node_id: 549
     ts: 1737083661651
     dur: 70166
+    monotonic_dur: 70166
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1806,6 +1870,7 @@
     node_id: 564
     ts: 1737084352020
     dur: 610605
+    monotonic_dur: 610605
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1826,6 +1891,7 @@
     node_id: 607
     ts: 1737085172910
     dur: 177041
+    monotonic_dur: 177041
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1846,6 +1912,7 @@
     node_id: 616
     ts: 1737085701252
     dur: 74351
+    monotonic_dur: 74351
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1866,6 +1933,7 @@
     node_id: 622
     ts: 1737085890068
     dur: 82270
+    monotonic_dur: 82270
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1886,6 +1954,7 @@
     node_id: 628
     ts: 1737086096530
     dur: 66276
+    monotonic_dur: 66276
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1906,6 +1975,7 @@
     node_id: 635
     ts: 1737086457461
     dur: 221578
+    monotonic_dur: 221578
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1926,6 +1996,7 @@
     node_id: 648
     ts: 1737086937596
     dur: 101313
+    monotonic_dur: 101313
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1946,6 +2017,7 @@
     node_id: 658
     ts: 1737087250329
     dur: 70570
+    monotonic_dur: 70570
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1966,6 +2038,7 @@
     node_id: 668
     ts: 1737087510285
     dur: 72680
+    monotonic_dur: 72680
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1986,6 +2059,7 @@
     node_id: 678
     ts: 1737087776958
     dur: 77652
+    monotonic_dur: 77652
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2006,6 +2080,7 @@
     node_id: 691
     ts: 1737088173007
     dur: 21327
+    monotonic_dur: 21327
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2026,6 +2101,7 @@
     node_id: 700
     ts: 1737088385479
     dur: 19449
+    monotonic_dur: 19449
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2046,6 +2122,7 @@
     node_id: 711
     ts: 1737088642115
     dur: 19776
+    monotonic_dur: 19776
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2066,6 +2143,7 @@
     node_id: 721
     ts: 1737088884385
     dur: 20125
+    monotonic_dur: 20125
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2086,6 +2164,7 @@
     node_id: 734
     ts: 1737089379631
     dur: 22080
+    monotonic_dur: 22080
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2106,6 +2185,7 @@
     node_id: 743
     ts: 1737089611044
     dur: 18225
+    monotonic_dur: 18225
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2126,6 +2206,7 @@
     node_id: 754
     ts: 1737089904720
     dur: 18856
+    monotonic_dur: 18856
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2146,6 +2227,7 @@
     node_id: 767
     ts: 1737090147338
     dur: 18570
+    monotonic_dur: 18570
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2166,6 +2248,7 @@
     node_id: 789
     ts: 1737093129477
     dur: 22632
+    monotonic_dur: 22632
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2186,6 +2269,7 @@
     node_id: 799
     ts: 1737093665987
     dur: 21548
+    monotonic_dur: 21548
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2206,6 +2290,7 @@
     node_id: 5343
     ts: 1737738509304
     dur: 1506011
+    monotonic_dur: 1506011
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2236,6 +2321,7 @@
     node_id: 5423
     ts: 1737750680394
     dur: 61812
+    monotonic_dur: 61812
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2266,6 +2352,7 @@
     node_id: 5431
     ts: 1737751668053
     dur: 197119
+    monotonic_dur: 197119
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2296,6 +2383,7 @@
     node_id: 5440
     ts: 1737752144687
     dur: 51147
+    monotonic_dur: 51147
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2326,6 +2414,7 @@
     node_id: 5448
     ts: 1737752590130
     dur: 958626
+    monotonic_dur: 958626
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2356,6 +2445,7 @@
     node_id: 5465
     ts: 1737757070844
     dur: 36740
+    monotonic_dur: 36740
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2386,6 +2476,7 @@
     node_id: 5474
     ts: 1737757342251
     dur: 42105
+    monotonic_dur: 42105
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2416,6 +2507,7 @@
     node_id: 5480
     ts: 1737757559170
     dur: 132635
+    monotonic_dur: 132635
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2446,6 +2538,7 @@
     node_id: 15853
     ts: 1740068387427
     dur: 60320
+    monotonic_dur: 60320
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2476,6 +2569,7 @@
     node_id: 15858
     ts: 1740068565965
     dur: 18127
+    monotonic_dur: 18127
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2506,6 +2600,7 @@
     node_id: 15863
     ts: 1740068675554
     dur: 17200
+    monotonic_dur: 17200
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2536,6 +2631,7 @@
     node_id: 15868
     ts: 1740068776690
     dur: 17264
+    monotonic_dur: 17264
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2566,6 +2662,7 @@
     node_id: 15873
     ts: 1740068878149
     dur: 17045
+    monotonic_dur: 17045
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2596,6 +2693,7 @@
     node_id: 15878
     ts: 1740068977698
     dur: 16964
+    monotonic_dur: 16964
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2626,6 +2724,7 @@
     node_id: 15883
     ts: 1740069076545
     dur: 16993
+    monotonic_dur: 16993
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2656,6 +2755,7 @@
     node_id: 15914
     ts: 1740071592461
     dur: 20257
+    monotonic_dur: 20257
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2686,6 +2786,7 @@
     node_id: 15919
     ts: 1740071715050
     dur: 17399
+    monotonic_dur: 17399
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2716,6 +2817,7 @@
     node_id: 15924
     ts: 1740071816220
     dur: 16289
+    monotonic_dur: 16289
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2746,6 +2848,7 @@
     node_id: 15929
     ts: 1740071909638
     dur: 17007
+    monotonic_dur: 17007
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2776,6 +2879,7 @@
     node_id: 15934
     ts: 1740072108820
     dur: 16704
+    monotonic_dur: 16704
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2806,6 +2910,7 @@
     node_id: 15939
     ts: 1740072205156
     dur: 22851
+    monotonic_dur: 22851
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2836,6 +2941,7 @@
     node_id: 15944
     ts: 1740072318829
     dur: 16368
+    monotonic_dur: 16368
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2866,6 +2972,7 @@
     node_id: 19099
     ts: 1740149607242
     dur: 4134255
+    monotonic_dur: 4134255
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2896,6 +3003,7 @@
     node_id: 19107
     ts: 1740154026307
     dur: 19643
+    monotonic_dur: 19643
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2926,6 +3034,7 @@
     node_id: 19112
     ts: 1740154147385
     dur: 17924
+    monotonic_dur: 17924
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2956,6 +3065,7 @@
     node_id: 19117
     ts: 1740154249350
     dur: 17234
+    monotonic_dur: 17234
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2986,6 +3096,7 @@
     node_id: 19122
     ts: 1740154360413
     dur: 17225
+    monotonic_dur: 17225
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3016,6 +3127,7 @@
     node_id: 19127
     ts: 1740154457143
     dur: 16522
+    monotonic_dur: 16522
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3046,6 +3158,7 @@
     node_id: 19132
     ts: 1740154550391
     dur: 16256
+    monotonic_dur: 16256
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3076,6 +3189,7 @@
     node_id: 19137
     ts: 1740154698023
     dur: 17672
+    monotonic_dur: 17672
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3106,6 +3220,7 @@
     node_id: 19150
     ts: 1740155084763
     dur: 224375
+    monotonic_dur: 224375
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3136,6 +3251,7 @@
     node_id: 1726
     ts: 1737207724565
     dur: 293900
+    monotonic_dur: 293900
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3166,6 +3282,7 @@
     node_id: 1732
     ts: 1737208096677
     dur: 18837
+    monotonic_dur: 18837
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3196,6 +3313,7 @@
     node_id: 1772
     ts: 1737210611879
     dur: 915778
+    monotonic_dur: 915778
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3216,6 +3334,7 @@
     node_id: 1825
     ts: 1737214360668
     dur: 22107
+    monotonic_dur: 22107
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3236,6 +3355,7 @@
     node_id: 1830
     ts: 1737214486888
     dur: 17063
+    monotonic_dur: 17063
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3256,6 +3376,7 @@
     node_id: 1835
     ts: 1737214594606
     dur: 16069
+    monotonic_dur: 16069
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3276,6 +3397,7 @@
     node_id: 1840
     ts: 1737214699981
     dur: 16203
+    monotonic_dur: 16203
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3296,6 +3418,7 @@
     node_id: 1845
     ts: 1737214804256
     dur: 16029
+    monotonic_dur: 16029
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3316,6 +3439,7 @@
     node_id: 1850
     ts: 1737214908097
     dur: 16476
+    monotonic_dur: 16476
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3336,6 +3460,7 @@
     node_id: 1855
     ts: 1737215012821
     dur: 2326724
+    monotonic_dur: 2326724
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3356,6 +3481,7 @@
     node_id: 1861
     ts: 1737217472621
     dur: 17678
+    monotonic_dur: 17678
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3376,6 +3502,7 @@
     node_id: 14124
     ts: 1739955629621
     dur: 618271
+    monotonic_dur: 618271
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3406,6 +3533,7 @@
     node_id: 14141
     ts: 1739956770216
     dur: 33942
+    monotonic_dur: 33942
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3426,6 +3554,7 @@
     node_id: 14147
     ts: 1739956981240
     dur: 212483
+    monotonic_dur: 212483
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3446,6 +3575,7 @@
     node_id: 14156
     ts: 1739957398685
     dur: 27945
+    monotonic_dur: 27945
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3466,6 +3596,7 @@
     node_id: 14163
     ts: 1739957560321
     dur: 33593
+    monotonic_dur: 33593
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3486,6 +3617,7 @@
     node_id: 14177
     ts: 1739957759077
     dur: 38184
+    monotonic_dur: 38184
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3506,6 +3638,7 @@
     node_id: 14207
     ts: 1739957975470
     dur: 32312
+    monotonic_dur: 32312
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3526,6 +3659,7 @@
     node_id: 15361
     ts: 1740030984676
     dur: 23693
+    monotonic_dur: 23693
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3546,6 +3680,7 @@
     node_id: 1039
     ts: 1737131797869
     dur: 46496
+    monotonic_dur: 46496
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3576,6 +3711,7 @@
     node_id: 1042
     ts: 1737131917363
     dur: 17474
+    monotonic_dur: 17474
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3606,6 +3742,7 @@
     node_id: 1077
     ts: 1737137616437
     dur: 162992
+    monotonic_dur: 162992
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3636,6 +3773,7 @@
     node_id: 1082
     ts: 1737137954753
     dur: 18084
+    monotonic_dur: 18084
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3666,6 +3804,7 @@
     node_id: 1087
     ts: 1737138059714
     dur: 17620
+    monotonic_dur: 17620
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3696,6 +3835,7 @@
     node_id: 1092
     ts: 1737138160355
     dur: 17037
+    monotonic_dur: 17037
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3726,6 +3866,7 @@
     node_id: 1097
     ts: 1737138259410
     dur: 17665
+    monotonic_dur: 17665
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3756,6 +3897,7 @@
     node_id: 1102
     ts: 1737138360249
     dur: 17002
+    monotonic_dur: 17002
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3786,6 +3928,7 @@
     node_id: 1107
     ts: 1737138459376
     dur: 16904
+    monotonic_dur: 16904
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3816,6 +3959,7 @@
     node_id: 1112
     ts: 1737138566775
     dur: 17308
+    monotonic_dur: 17308
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3846,6 +3990,7 @@
     node_id: 1117
     ts: 1737138706375
     dur: 16366
+    monotonic_dur: 16366
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3876,6 +4021,7 @@
     node_id: 914
     ts: 1737110538163
     dur: 10093878
+    monotonic_dur: 10093878
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3906,6 +4052,7 @@
     node_id: 930
     ts: 1737120738139
     dur: 44747
+    monotonic_dur: 44747
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3936,6 +4083,7 @@
     node_id: 994
     ts: 1737130388552
     dur: 21356
+    monotonic_dur: 21356
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3956,6 +4104,7 @@
     node_id: 999
     ts: 1737130575575
     dur: 18416
+    monotonic_dur: 18416
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3976,6 +4125,7 @@
     node_id: 1004
     ts: 1737130679877
     dur: 18378
+    monotonic_dur: 18378
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3996,6 +4146,7 @@
     node_id: 1009
     ts: 1737130782643
     dur: 17093
+    monotonic_dur: 17093
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4016,6 +4167,7 @@
     node_id: 1014
     ts: 1737130882317
     dur: 17017
+    monotonic_dur: 17017
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4036,6 +4188,7 @@
     node_id: 1019
     ts: 1737130982066
     dur: 17021
+    monotonic_dur: 17021
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4056,6 +4209,7 @@
     node_id: 1024
     ts: 1737131081147
     dur: 17016
+    monotonic_dur: 17016
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4076,6 +4230,7 @@
     node_id: 1029
     ts: 1737131180347
     dur: 17452
+    monotonic_dur: 17452
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4096,6 +4251,7 @@
     node_id: 1034
     ts: 1737131293842
     dur: 16845
+    monotonic_dur: 16845
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4116,6 +4272,7 @@
     node_id: 1310
     ts: 1737163058873
     dur: 19376
+    monotonic_dur: 19376
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4136,6 +4293,7 @@
     node_id: 1313
     ts: 1737163156482
     dur: 18447
+    monotonic_dur: 18447
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4156,6 +4314,7 @@
     node_id: 1343
     ts: 1737165262724
     dur: 21096
+    monotonic_dur: 21096
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4176,6 +4335,7 @@
     node_id: 1349
     ts: 1737165472300
     dur: 26488
+    monotonic_dur: 26488
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4196,6 +4356,7 @@
     node_id: 1364
     ts: 1737165613345
     dur: 16393
+    monotonic_dur: 16393
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4216,6 +4377,7 @@
     node_id: 1369
     ts: 1737165708794
     dur: 16172
+    monotonic_dur: 16172
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4236,6 +4398,7 @@
     node_id: 1374
     ts: 1737165803090
     dur: 16154
+    monotonic_dur: 16154
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4256,6 +4419,7 @@
     node_id: 1379
     ts: 1737165902444
     dur: 16514
+    monotonic_dur: 16514
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4276,6 +4440,7 @@
     node_id: 1384
     ts: 1737165995669
     dur: 16227
+    monotonic_dur: 16227
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4296,6 +4461,7 @@
     node_id: 1389
     ts: 1737166088126
     dur: 16084
+    monotonic_dur: 16084
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4316,6 +4482,7 @@
     node_id: 1394
     ts: 1737166180874
     dur: 16400
+    monotonic_dur: 16400
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4336,6 +4503,7 @@
     node_id: 1506
     ts: 1737181487572
     dur: 47351
+    monotonic_dur: 47351
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4366,6 +4534,7 @@
     node_id: 1510
     ts: 1737181929327
     dur: 20962
+    monotonic_dur: 20962
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4396,6 +4565,7 @@
     node_id: 1553
     ts: 1737185887986
     dur: 36773
+    monotonic_dur: 36773
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4426,6 +4596,7 @@
     node_id: 1558
     ts: 1737186081562
     dur: 17416
+    monotonic_dur: 17416
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4456,6 +4627,7 @@
     node_id: 1563
     ts: 1737186184623
     dur: 18396
+    monotonic_dur: 18396
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4486,6 +4658,7 @@
     node_id: 1568
     ts: 1737186286357
     dur: 17995
+    monotonic_dur: 17995
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4516,6 +4689,7 @@
     node_id: 1573
     ts: 1737186385961
     dur: 16913
+    monotonic_dur: 16913
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4546,6 +4720,7 @@
     node_id: 1578
     ts: 1737186484644
     dur: 16614
+    monotonic_dur: 16614
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4576,6 +4751,7 @@
     node_id: 1583
     ts: 1737186582856
     dur: 16982
+    monotonic_dur: 16982
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4606,6 +4782,7 @@
     node_id: 1588
     ts: 1737186680997
     dur: 16616
+    monotonic_dur: 16616
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4636,6 +4813,7 @@
     node_id: 1593
     ts: 1737186777333
     dur: 17100
+    monotonic_dur: 17100
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4666,6 +4844,7 @@
     node_id: 16170
     ts: 1740097708826
     dur: 88231
+    monotonic_dur: 88231
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4701,6 +4880,7 @@
     node_id: 4028
     ts: 1737344126801
     dur: 22797
+    monotonic_dur: 22797
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4731,6 +4911,7 @@
     node_id: 5656
     ts: 1737785654002
     dur: 22938
+    monotonic_dur: 22938
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4761,6 +4942,7 @@
     node_id: 5761
     ts: 1737787806610
     dur: 22728
+    monotonic_dur: 22728
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4791,6 +4973,7 @@
     node_id: 19095
     ts: 1740149257124
     dur: 21884
+    monotonic_dur: 21884
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4821,6 +5004,7 @@
     node_id: 4233
     ts: 1737371256653
     dur: 1055512
+    monotonic_dur: 1055512
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4851,6 +5035,7 @@
     node_id: 14106
     ts: 1739953546712
     dur: 44814
+    monotonic_dur: 44814
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4881,6 +5066,7 @@
     node_id: 14227
     ts: 1739958399006
     dur: 33080
+    monotonic_dur: 33080
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4901,6 +5087,7 @@
     node_id: 15352
     ts: 1740030452448
     dur: 132766
+    monotonic_dur: 132766
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4921,6 +5108,7 @@
     node_id: 4025
     ts: 1737343049979
     dur: 22668
+    monotonic_dur: 22668
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4951,6 +5139,7 @@
     node_id: 1289
     ts: 1737161421139
     dur: 20479
+    monotonic_dur: 20479
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4981,6 +5170,7 @@
     node_id: 1291
     ts: 1737161616671
     dur: 18545
+    monotonic_dur: 18545
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5011,6 +5201,7 @@
     node_id: 1399
     ts: 1737166461659
     dur: 19206
+    monotonic_dur: 19206
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5041,6 +5232,7 @@
     node_id: 286
     ts: 1737055789278
     dur: 40769
+    monotonic_dur: 40769
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5071,6 +5263,7 @@
     node_id: 10955
     ts: 1738826773946
     dur: 65637
+    monotonic_dur: 65637
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5101,6 +5294,7 @@
     node_id: 10966
     ts: 1738828107585
     dur: 187487
+    monotonic_dur: 187487
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5131,6 +5325,7 @@
     node_id: 14241
     ts: 1739964126021
     dur: 35852
+    monotonic_dur: 35852
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5151,6 +5346,7 @@
     node_id: 14243
     ts: 1739964658240
     dur: 34889
+    monotonic_dur: 34889
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5171,6 +5367,7 @@
     node_id: 1297
     ts: 1737162104329
     dur: 183696
+    monotonic_dur: 183696
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5201,6 +5398,7 @@
     node_id: 14245
     ts: 1739965127438
     dur: 37681
+    monotonic_dur: 37681
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5221,6 +5419,7 @@
     node_id: 228
     ts: 1737051099036
     dur: 48097
+    monotonic_dur: 48097
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5251,6 +5450,7 @@
     node_id: 5658
     ts: 1737785934018
     dur: 19831
+    monotonic_dur: 19831
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5281,6 +5481,7 @@
     node_id: 14110
     ts: 1739953949546
     dur: 41355
+    monotonic_dur: 41355
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5311,6 +5512,7 @@
     node_id: 20837
     ts: 1740282732663
     dur: 75213
+    monotonic_dur: 75213
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5341,6 +5543,7 @@
     node_id: 14730
     ts: 1739991072170
     dur: 23552
+    monotonic_dur: 23552
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5371,6 +5574,7 @@
     node_id: 14903
     ts: 1740006407801
     dur: 28042
+    monotonic_dur: 28042
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5401,6 +5605,7 @@
     node_id: 15617
     ts: 1740039831041
     dur: 21671
+    monotonic_dur: 21671
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5431,6 +5636,7 @@
     node_id: 14757
     ts: 1739995747475
     dur: 22859
+    monotonic_dur: 22859
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5461,6 +5667,7 @@
     node_id: 14961
     ts: 1740008070118
     dur: 21573
+    monotonic_dur: 21573
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5491,6 +5698,7 @@
     node_id: 15144
     ts: 1740018472842
     dur: 22492
+    monotonic_dur: 22492
     blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5521,6 +5729,7 @@
     node_id: 291
     ts: 1737056375519
     dur: 37555955
+    monotonic_dur: 37555955
     blocking_method: "boolean com.android.server.am.ActivityManagerService.forceStopPackageLocked(java.lang.String, int, boolean, boolean, boolean, boolean, boolean, int, java.lang.String)"
     blocked_method: "boolean com.android.server.am.ActivityManagerService.isUidActive(int, java.lang.String)"
     short_blocking_method: "com.android.server.am.ActivityManagerService.forceStopPackageLocked"
@@ -5558,6 +5767,7 @@
     node_id: 5679
     ts: 1737786392325
     dur: 307737
+    monotonic_dur: 307737
     blocking_method: "boolean com.android.server.am.OomAdjuster.updateOomAdjLocked(com.android.server.am.ProcessRecord, java.lang.String)"
     blocked_method: "void com.android.server.am.ActivityManagerService$LocalService.notifyNetworkPolicyRulesUpdated(int, long)"
     short_blocking_method: "com.android.server.am.OomAdjuster.updateOomAdjLocked"
@@ -5588,6 +5798,7 @@
     node_id: 4163
     ts: 1737369931286
     dur: 332456
+    monotonic_dur: 332456
     blocking_method: "boolean com.android.server.am.OomAdjuster.updateOomAdjLocked(com.android.server.am.ProcessRecord, java.lang.String)"
     blocked_method: "void com.android.server.am.ActivityManagerService$LocalService.notifyNetworkPolicyRulesUpdated(int, long)"
     short_blocking_method: "com.android.server.am.OomAdjuster.updateOomAdjLocked"
@@ -5618,6 +5829,7 @@
     node_id: 1405
     ts: 1737166679041
     dur: 18738
+    monotonic_dur: 18738
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5648,6 +5860,7 @@
     node_id: 1410
     ts: 1737166789697
     dur: 18114
+    monotonic_dur: 18114
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5678,6 +5891,7 @@
     node_id: 1415
     ts: 1737166892174
     dur: 17346
+    monotonic_dur: 17346
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5708,6 +5922,7 @@
     node_id: 1420
     ts: 1737166992097
     dur: 17240
+    monotonic_dur: 17240
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5738,6 +5953,7 @@
     node_id: 1425
     ts: 1737167090769
     dur: 17223
+    monotonic_dur: 17223
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5768,6 +5984,7 @@
     node_id: 1430
     ts: 1737167189280
     dur: 17404
+    monotonic_dur: 17404
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5798,6 +6015,7 @@
     node_id: 336
     ts: 1737064905607
     dur: 36485
+    monotonic_dur: 36485
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5818,6 +6036,7 @@
     node_id: 450
     ts: 1737080194439
     dur: 106755
+    monotonic_dur: 106755
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5838,6 +6057,7 @@
     node_id: 547
     ts: 1737083570272
     dur: 22979
+    monotonic_dur: 22979
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5858,6 +6078,7 @@
     node_id: 553
     ts: 1737083767030
     dur: 87452
+    monotonic_dur: 87452
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5878,6 +6099,7 @@
     node_id: 600
     ts: 1737085028725
     dur: 22524
+    monotonic_dur: 22524
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5898,6 +6120,7 @@
     node_id: 613
     ts: 1737085397198
     dur: 222027
+    monotonic_dur: 222027
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5918,6 +6141,7 @@
     node_id: 620
     ts: 1737085814565
     dur: 20392
+    monotonic_dur: 20392
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5938,6 +6162,7 @@
     node_id: 626
     ts: 1737086010699
     dur: 21428
+    monotonic_dur: 21428
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5958,6 +6183,7 @@
     node_id: 632
     ts: 1737086195810
     dur: 82235
+    monotonic_dur: 82235
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5978,6 +6204,7 @@
     node_id: 5427
     ts: 1737750845100
     dur: 55306
+    monotonic_dur: 55306
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6008,6 +6235,7 @@
     node_id: 5437
     ts: 1737751957836
     dur: 57557
+    monotonic_dur: 57557
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6038,6 +6266,7 @@
     node_id: 5445
     ts: 1737752295207
     dur: 148524
+    monotonic_dur: 148524
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6068,6 +6297,7 @@
     node_id: 5455
     ts: 1737753638544
     dur: 3315112
+    monotonic_dur: 3315112
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6098,6 +6328,7 @@
     node_id: 5471
     ts: 1737757172791
     dur: 36455
+    monotonic_dur: 36455
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6128,6 +6359,7 @@
     node_id: 5478
     ts: 1737757436661
     dur: 33956
+    monotonic_dur: 33956
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6158,6 +6390,7 @@
     node_id: 15856
     ts: 1740068492050
     dur: 19741
+    monotonic_dur: 19741
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6188,6 +6421,7 @@
     node_id: 15861
     ts: 1740068610842
     dur: 17707
+    monotonic_dur: 17707
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6218,6 +6452,7 @@
     node_id: 15866
     ts: 1740068718431
     dur: 17491
+    monotonic_dur: 17491
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6248,6 +6483,7 @@
     node_id: 15871
     ts: 1740068819512
     dur: 17871
+    monotonic_dur: 17871
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6278,6 +6514,7 @@
     node_id: 15876
     ts: 1740068920129
     dur: 17449
+    monotonic_dur: 17449
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6308,6 +6545,7 @@
     node_id: 15881
     ts: 1740069019548
     dur: 17287
+    monotonic_dur: 17287
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6338,6 +6576,7 @@
     node_id: 15886
     ts: 1740069124909
     dur: 17544
+    monotonic_dur: 17544
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6368,6 +6607,7 @@
     node_id: 15917
     ts: 1740071648279
     dur: 18916
+    monotonic_dur: 18916
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6398,6 +6638,7 @@
     node_id: 15922
     ts: 1740071756861
     dur: 16967
+    monotonic_dur: 16967
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6428,6 +6669,7 @@
     node_id: 15927
     ts: 1740071855963
     dur: 16545
+    monotonic_dur: 16545
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6458,6 +6700,7 @@
     node_id: 15932
     ts: 1740071990692
     dur: 56291
+    monotonic_dur: 56291
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6488,6 +6731,7 @@
     node_id: 15937
     ts: 1740072150609
     dur: 16590
+    monotonic_dur: 16590
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6518,6 +6762,7 @@
     node_id: 15942
     ts: 1740072261613
     dur: 18126
+    monotonic_dur: 18126
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6548,6 +6793,7 @@
     node_id: 15947
     ts: 1740072358594
     dur: 16392
+    monotonic_dur: 16392
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6578,6 +6824,7 @@
     node_id: 16250
     ts: 1740099416847
     dur: 42564
+    monotonic_dur: 42564
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6608,6 +6855,7 @@
     node_id: 19104
     ts: 1740153788345
     dur: 21717
+    monotonic_dur: 21717
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6638,6 +6886,7 @@
     node_id: 19110
     ts: 1740154078337
     dur: 18626
+    monotonic_dur: 18626
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6668,6 +6917,7 @@
     node_id: 19115
     ts: 1740154191235
     dur: 17446
+    monotonic_dur: 17446
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6698,6 +6948,7 @@
     node_id: 19120
     ts: 1740154302692
     dur: 17692
+    monotonic_dur: 17692
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6728,6 +6979,7 @@
     node_id: 19125
     ts: 1740154401863
     dur: 17420
+    monotonic_dur: 17420
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6758,6 +7010,7 @@
     node_id: 19130
     ts: 1740154496716
     dur: 16532
+    monotonic_dur: 16532
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6788,6 +7041,7 @@
     node_id: 19135
     ts: 1740154589516
     dur: 16334
+    monotonic_dur: 16334
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6818,6 +7072,7 @@
     node_id: 2419
     ts: 1737240599881
     dur: 42310
+    monotonic_dur: 42310
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6848,6 +7103,7 @@
     node_id: 1828
     ts: 1737214417825
     dur: 18273
+    monotonic_dur: 18273
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6868,6 +7124,7 @@
     node_id: 1833
     ts: 1737214530615
     dur: 16604
+    monotonic_dur: 16604
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6888,6 +7145,7 @@
     node_id: 1838
     ts: 1737214636440
     dur: 16932
+    monotonic_dur: 16932
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6908,6 +7166,7 @@
     node_id: 1843
     ts: 1737214741536
     dur: 16227
+    monotonic_dur: 16227
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6928,6 +7187,7 @@
     node_id: 1848
     ts: 1737214845608
     dur: 16214
+    monotonic_dur: 16214
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6948,6 +7208,7 @@
     node_id: 1853
     ts: 1737214949887
     dur: 16260
+    monotonic_dur: 16260
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6968,6 +7229,7 @@
     node_id: 1859
     ts: 1737217389586
     dur: 20823
+    monotonic_dur: 20823
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6988,6 +7250,7 @@
     node_id: 1864
     ts: 1737217518658
     dur: 18293
+    monotonic_dur: 18293
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7008,6 +7271,7 @@
     node_id: 2485
     ts: 1737245705728
     dur: 4362
+    monotonic_dur: 4362
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7033,6 +7297,7 @@
     node_id: 14131
     ts: 1739956333592
     dur: 48179
+    monotonic_dur: 48179
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7063,6 +7328,7 @@
     node_id: 14144
     ts: 1739956863678
     dur: 31443
+    monotonic_dur: 31443
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7083,6 +7349,7 @@
     node_id: 14154
     ts: 1739957260292
     dur: 58458
+    monotonic_dur: 58458
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7103,6 +7370,7 @@
     node_id: 14159
     ts: 1739957468620
     dur: 28295
+    monotonic_dur: 28295
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7123,6 +7391,7 @@
     node_id: 14172
     ts: 1739957659134
     dur: 27483
+    monotonic_dur: 27483
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7143,6 +7412,7 @@
     node_id: 14190
     ts: 1739957843194
     dur: 38223
+    monotonic_dur: 38223
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7163,6 +7433,7 @@
     node_id: 14218
     ts: 1739958067210
     dur: 28514
+    monotonic_dur: 28514
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7183,6 +7454,7 @@
     node_id: 1080
     ts: 1737137827035
     dur: 20665
+    monotonic_dur: 20665
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7213,6 +7485,7 @@
     node_id: 1085
     ts: 1737137999738
     dur: 17916
+    monotonic_dur: 17916
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7243,6 +7516,7 @@
     node_id: 1090
     ts: 1737138102876
     dur: 17436
+    monotonic_dur: 17436
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7273,6 +7547,7 @@
     node_id: 1095
     ts: 1737138202412
     dur: 17207
+    monotonic_dur: 17207
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7303,6 +7578,7 @@
     node_id: 1100
     ts: 1737138302518
     dur: 17756
+    monotonic_dur: 17756
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7333,6 +7609,7 @@
     node_id: 1105
     ts: 1737138402108
     dur: 17640
+    monotonic_dur: 17640
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7363,6 +7640,7 @@
     node_id: 1110
     ts: 1737138508966
     dur: 17284
+    monotonic_dur: 17284
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7393,6 +7671,7 @@
     node_id: 1115
     ts: 1737138607722
     dur: 58793
+    monotonic_dur: 58793
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7423,6 +7702,7 @@
     node_id: 1120
     ts: 1737138746994
     dur: 16813
+    monotonic_dur: 16813
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7453,6 +7733,7 @@
     node_id: 997
     ts: 1737130453174
     dur: 19583
+    monotonic_dur: 19583
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7473,6 +7754,7 @@
     node_id: 1002
     ts: 1737130620879
     dur: 17882
+    monotonic_dur: 17882
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7493,6 +7775,7 @@
     node_id: 1007
     ts: 1737130724438
     dur: 17847
+    monotonic_dur: 17847
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7513,6 +7796,7 @@
     node_id: 1012
     ts: 1737130824923
     dur: 17378
+    monotonic_dur: 17378
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7533,6 +7817,7 @@
     node_id: 1017
     ts: 1737130924318
     dur: 17952
+    monotonic_dur: 17952
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7553,6 +7838,7 @@
     node_id: 1022
     ts: 1737131023637
     dur: 17902
+    monotonic_dur: 17902
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7573,6 +7859,7 @@
     node_id: 1027
     ts: 1737131123118
     dur: 17327
+    monotonic_dur: 17327
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7593,6 +7880,7 @@
     node_id: 1032
     ts: 1737131236193
     dur: 17929
+    monotonic_dur: 17929
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7613,6 +7901,7 @@
     node_id: 1037
     ts: 1737131334215
     dur: 16603
+    monotonic_dur: 16603
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7633,6 +7922,7 @@
     node_id: 1347
     ts: 1737165356298
     dur: 20332
+    monotonic_dur: 20332
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7653,6 +7943,7 @@
     node_id: 1361
     ts: 1737165537252
     dur: 37481
+    monotonic_dur: 37481
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7673,6 +7964,7 @@
     node_id: 1367
     ts: 1737165653862
     dur: 17155
+    monotonic_dur: 17155
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7693,6 +7985,7 @@
     node_id: 1372
     ts: 1737165748745
     dur: 16809
+    monotonic_dur: 16809
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7713,6 +8006,7 @@
     node_id: 1377
     ts: 1737165848320
     dur: 16352
+    monotonic_dur: 16352
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7733,6 +8027,7 @@
     node_id: 1382
     ts: 1737165942133
     dur: 16587
+    monotonic_dur: 16587
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7753,6 +8048,7 @@
     node_id: 1387
     ts: 1737166034874
     dur: 16267
+    monotonic_dur: 16267
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7773,6 +8069,7 @@
     node_id: 1392
     ts: 1737166127218
     dur: 16224
+    monotonic_dur: 16224
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7793,6 +8090,7 @@
     node_id: 1397
     ts: 1737166220113
     dur: 16151
+    monotonic_dur: 16151
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7813,6 +8111,7 @@
     node_id: 1556
     ts: 1737185963232
     dur: 19053
+    monotonic_dur: 19053
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7843,6 +8142,7 @@
     node_id: 1561
     ts: 1737186125286
     dur: 18053
+    monotonic_dur: 18053
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7873,6 +8173,7 @@
     node_id: 1566
     ts: 1737186228484
     dur: 17302
+    monotonic_dur: 17302
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7903,6 +8204,7 @@
     node_id: 1571
     ts: 1737186329374
     dur: 17099
+    monotonic_dur: 17099
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7933,6 +8235,7 @@
     node_id: 1576
     ts: 1737186427621
     dur: 17307
+    monotonic_dur: 17307
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7963,6 +8266,7 @@
     node_id: 1581
     ts: 1737186526032
     dur: 17399
+    monotonic_dur: 17399
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7993,6 +8297,7 @@
     node_id: 1586
     ts: 1737186624590
     dur: 17194
+    monotonic_dur: 17194
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -8023,6 +8328,7 @@
     node_id: 1591
     ts: 1737186721862
     dur: 16600
+    monotonic_dur: 16600
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -8053,6 +8359,7 @@
     node_id: 1596
     ts: 1737186818912
     dur: 17743
+    monotonic_dur: 17743
     blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -8083,6 +8390,7 @@
     node_id: 1337
     ts: 1737164392191
     dur: 270357
+    monotonic_dur: 270357
     blocking_method: "com.android.server.am.ProcessRecord com.android.server.am.ProcessList.removeProcessNameLocked(java.lang.String, int, com.android.server.am.ProcessRecord)"
     blocked_method: "boolean com.android.server.am.ActivityManagerService.isUidActive(int, java.lang.String)"
     short_blocking_method: "com.android.server.am.ProcessList.removeProcessNameLocked"
@@ -8105,6 +8413,7 @@
     node_id: 1542
     ts: 1737183322309
     dur: 1164236
+    monotonic_dur: 1164236
     blocking_method: "com.android.server.am.ProcessRecord com.android.server.am.ProcessList.removeProcessNameLocked(java.lang.String, int, com.android.server.am.ProcessRecord)"
     blocked_method: "boolean com.android.server.am.ActivityManagerService.isUidActive(int, java.lang.String)"
     short_blocking_method: "com.android.server.am.ProcessList.removeProcessNameLocked"
@@ -8137,6 +8446,7 @@
     node_id: 4016
     ts: 1737341060765
     dur: 500783
+    monotonic_dur: 500783
     blocking_method: "com.android.server.pm.Computer com.android.server.pm.PackageManagerService.snapshotComputer()"
     blocked_method: "com.android.server.pm.Computer com.android.server.pm.PackageManagerService.snapshotComputer()"
     short_blocking_method: "com.android.server.pm.PackageManagerService.snapshotComputer"
@@ -8177,6 +8487,7 @@
     node_id: 14151
     ts: 1739957159014
     dur: 1509341
+    monotonic_dur: 1509341
     blocking_method: "int com.android.server.am.ActivityManagerService.bindServiceInstance(android.app.IApplicationThread, android.os.IBinder, android.content.Intent, java.lang.String, android.app.IServiceConnection, int, java.lang.String, boolean, int, java.lang.String, java.lang.String, int)"
     blocked_method: "void com.android.server.am.ActivityManagerService.publishService(android.os.IBinder, android.content.Intent, android.os.IBinder)"
     short_blocking_method: "com.android.server.am.ActivityManagerService.bindServiceInstance"
@@ -8199,6 +8510,7 @@
     node_id: 14139
     ts: 1739956578839
     dur: 1980671
+    monotonic_dur: 1980671
     blocking_method: "int com.android.server.am.ActivityManagerService.bindServiceInstance(android.app.IApplicationThread, android.os.IBinder, android.content.Intent, java.lang.String, android.app.IServiceConnection, int, java.lang.String, boolean, int, java.lang.String, java.lang.String, int)"
     blocked_method: "void com.android.server.am.ActivityManagerService.serviceDoneExecuting(android.os.IBinder, int, int, int)"
     short_blocking_method: "com.android.server.am.ActivityManagerService.bindServiceInstance"
@@ -8229,6 +8541,7 @@
     node_id: 233
     ts: 1737052012461
     dur: 41841
+    monotonic_dur: 41841
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8259,6 +8572,7 @@
     node_id: 642
     ts: 1737086736113
     dur: 22026
+    monotonic_dur: 22026
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8279,6 +8593,7 @@
     node_id: 652
     ts: 1737087085776
     dur: 20982
+    monotonic_dur: 20982
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8299,6 +8614,7 @@
     node_id: 662
     ts: 1737087359159
     dur: 21012
+    monotonic_dur: 21012
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8319,6 +8635,7 @@
     node_id: 672
     ts: 1737087629336
     dur: 20625
+    monotonic_dur: 20625
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8339,6 +8656,7 @@
     node_id: 682
     ts: 1737087908874
     dur: 36432
+    monotonic_dur: 36432
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8359,6 +8677,7 @@
     node_id: 694
     ts: 1737088232763
     dur: 19794
+    monotonic_dur: 19794
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8379,6 +8698,7 @@
     node_id: 704
     ts: 1737088435540
     dur: 74457
+    monotonic_dur: 74457
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8399,6 +8719,7 @@
     node_id: 714
     ts: 1737088695169
     dur: 19264
+    monotonic_dur: 19264
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8419,6 +8740,7 @@
     node_id: 724
     ts: 1737088938281
     dur: 19838
+    monotonic_dur: 19838
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8439,6 +8761,7 @@
     node_id: 737
     ts: 1737089446994
     dur: 19502
+    monotonic_dur: 19502
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8459,6 +8782,7 @@
     node_id: 746
     ts: 1737089667267
     dur: 19612
+    monotonic_dur: 19612
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8479,6 +8803,7 @@
     node_id: 757
     ts: 1737089952687
     dur: 18324
+    monotonic_dur: 18324
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8499,6 +8824,7 @@
     node_id: 778
     ts: 1737090202518
     dur: 18886
+    monotonic_dur: 18886
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8519,6 +8845,7 @@
     node_id: 792
     ts: 1737093195601
     dur: 19790
+    monotonic_dur: 19790
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8539,6 +8866,7 @@
     node_id: 802
     ts: 1737093725219
     dur: 20720
+    monotonic_dur: 20720
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8559,6 +8887,7 @@
     node_id: 5363
     ts: 1737740148902
     dur: 62887
+    monotonic_dur: 62887
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8589,6 +8918,7 @@
     node_id: 5485
     ts: 1737757752455
     dur: 34371
+    monotonic_dur: 34371
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8619,6 +8949,7 @@
     node_id: 19140
     ts: 1740154747721
     dur: 17340
+    monotonic_dur: 17340
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8649,6 +8980,7 @@
     node_id: 19153
     ts: 1740155350826
     dur: 29306
+    monotonic_dur: 29306
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8679,6 +9011,7 @@
     node_id: 1735
     ts: 1737208148293
     dur: 18441
+    monotonic_dur: 18441
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8709,6 +9042,7 @@
     node_id: 15364
     ts: 1740031051846
     dur: 20196
+    monotonic_dur: 20196
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8729,6 +9063,7 @@
     node_id: 1045
     ts: 1737131968339
     dur: 17215
+    monotonic_dur: 17215
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8759,6 +9094,7 @@
     node_id: 933
     ts: 1737120850459
     dur: 20602
+    monotonic_dur: 20602
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8789,6 +9125,7 @@
     node_id: 1316
     ts: 1737163210116
     dur: 18147
+    monotonic_dur: 18147
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8809,6 +9146,7 @@
     node_id: 1513
     ts: 1737181998210
     dur: 19273
+    monotonic_dur: 19273
     blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
     blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
     short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8839,6 +9177,7 @@
     node_id: 14238
     ts: 1739963968503
     dur: 1421118
+    monotonic_dur: 1421118
     blocking_method: "int com.android.server.job.JobSchedulerService.scheduleAsPackage(android.app.job.JobInfo, android.app.job.JobWorkItem, int, java.lang.String, int, java.lang.String)"
     blocked_method: "void com.android.server.job.JobServiceContext.onServiceConnected(android.content.ComponentName, android.os.IBinder)"
     short_blocking_method: "com.android.server.job.JobSchedulerService.scheduleAsPackage"
@@ -8874,6 +9213,7 @@
     node_id: 20043
     ts: 1740213696044
     dur: 519686
+    monotonic_dur: 519686
     blocking_method: "void android.content.res.AssetManager.applyStyle(long, int, int, android.content.res.XmlBlock$Parser, int[], long, long)"
     blocked_method: "boolean android.content.res.AssetManager.isUpToDate()"
     short_blocking_method: "android.content.res.AssetManager.applyStyle"
@@ -8904,6 +9244,7 @@
     node_id: 325
     ts: 1737062755240
     dur: 40603
+    monotonic_dur: 40603
     blocking_method: "void android.os.MessageQueue.nativeWake(long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.nativeWake"
@@ -8924,6 +9265,7 @@
     node_id: 14507
     ts: 1739976886497
     dur: 29604
+    monotonic_dur: 29604
     blocking_method: "void android.os.MessageQueue.nativeWake(long)"
     blocked_method: "android.os.Message android.os.MessageQueue.next()"
     short_blocking_method: "android.os.MessageQueue.nativeWake"
@@ -8954,6 +9296,7 @@
     node_id: 36448
     ts: 1740519832439
     dur: 41153
+    monotonic_dur: 41153
     blocking_method: "void android.os.MessageQueue.removeSyncBarrier(int)"
     blocked_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
     short_blocking_method: "android.os.MessageQueue.removeSyncBarrier"
@@ -8989,6 +9332,7 @@
     node_id: 13934
     ts: 1739927671503
     dur: 12908792
+    monotonic_dur: 12908792
     blocking_method: "void com.android.server.StorageManagerService.onVolumeStateChangedAsync(android.os.storage.VolumeInfo, int, int)"
     blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
     short_blocking_method: "com.android.server.StorageManagerService.onVolumeStateChangedAsync"
@@ -9034,6 +9378,7 @@
     node_id: 13938
     ts: 1739927803390
     dur: 15628453
+    monotonic_dur: 15628453
     blocking_method: "void com.android.server.StorageManagerService.onVolumeStateChangedAsync(android.os.storage.VolumeInfo, int, int)"
     blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
     short_blocking_method: "com.android.server.StorageManagerService.onVolumeStateChangedAsync"
@@ -9056,6 +9401,7 @@
     node_id: 13948
     ts: 1739931845759
     dur: 9867807
+    monotonic_dur: 9867807
     blocking_method: "void com.android.server.StorageManagerService.onVolumeStateChangedAsync(android.os.storage.VolumeInfo, int, int)"
     blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
     short_blocking_method: "com.android.server.StorageManagerService.onVolumeStateChangedAsync"
@@ -9078,6 +9424,7 @@
     node_id: 2282
     ts: 1737231587234
     dur: 7359992
+    monotonic_dur: 7359992
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9108,6 +9455,7 @@
     node_id: 947
     ts: 1737121970382
     dur: 9553799
+    monotonic_dur: 9553799
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9148,6 +9496,7 @@
     node_id: 1768
     ts: 1737210433724
     dur: 9886915
+    monotonic_dur: 9886915
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9188,6 +9537,7 @@
     node_id: 1774
     ts: 1737210664931
     dur: 10603245
+    monotonic_dur: 10603245
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9208,6 +9558,7 @@
     node_id: 2284
     ts: 1737231637875
     dur: 8165621
+    monotonic_dur: 8165621
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9228,6 +9579,7 @@
     node_id: 1778
     ts: 1737210812768
     dur: 15412062
+    monotonic_dur: 15412062
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9248,6 +9600,7 @@
     node_id: 2289
     ts: 1737231841438
     dur: 8892876
+    monotonic_dur: 8892876
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9268,6 +9621,7 @@
     node_id: 1786
     ts: 1737211317791
     dur: 15990216
+    monotonic_dur: 15990216
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9288,6 +9642,7 @@
     node_id: 1822
     ts: 1737213945119
     dur: 14489462
+    monotonic_dur: 14489462
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9308,6 +9663,7 @@
     node_id: 15273
     ts: 1740028121682
     dur: 4258407
+    monotonic_dur: 4258407
     blocking_method: "void com.android.server.am.ActivityManagerService.attachApplication(android.app.IApplicationThread, long)"
     blocked_method: "int com.android.server.am.ActivityManagerService.broadcastIntentWithFeature(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.content.IIntentReceiver, int, java.lang.String, android.os.Bundle, java.lang.String[], java.lang.String[], java.lang.String[], int, android.os.Bundle, boolean, boolean, int)"
     short_blocking_method: "com.android.server.am.ActivityManagerService.attachApplication"
@@ -9343,6 +9699,7 @@
     node_id: 4240
     ts: 1737372928313
     dur: 11910
+    monotonic_dur: 11910
     blocking_method: "void com.android.server.am.ActivityManagerService.attachApplication(android.app.IApplicationThread, long)"
     blocked_method: "void com.android.server.am.BroadcastQueue.processNextBroadcast(boolean)"
     short_blocking_method: "com.android.server.am.ActivityManagerService.attachApplication"
@@ -9368,6 +9725,7 @@
     node_id: 15356
     ts: 1740030616665
     dur: 2229356
+    monotonic_dur: 2229356
     blocking_method: "void com.android.server.am.ActivityManagerService.attachApplication(android.app.IApplicationThread, long)"
     blocked_method: "void com.android.server.am.BroadcastQueue.processNextBroadcast(boolean)"
     short_blocking_method: "com.android.server.am.ActivityManagerService.attachApplication"
@@ -9388,6 +9746,7 @@
     node_id: 327
     ts: 1737063410007
     dur: 46114664
+    monotonic_dur: 46114664
     blocking_method: "void com.android.server.am.ActivityManagerService.forceStopPackage(java.lang.String, int)"
     blocked_method: "boolean com.android.server.am.ActivityManagerService.unbindService(android.app.IServiceConnection)"
     short_blocking_method: "com.android.server.am.ActivityManagerService.forceStopPackage"
@@ -9428,6 +9787,7 @@
     node_id: 1909
     ts: 1737220480342
     dur: 42187
+    monotonic_dur: 42187
     blocking_method: "void com.android.server.am.AppProfiler.collectPssInBackground()"
     blocked_method: "void com.android.server.am.ProcessProfileRecord.onProcessInactive(com.android.server.am.ProcessStatsService)"
     short_blocking_method: "com.android.server.am.AppProfiler.collectPssInBackground"
@@ -9459,6 +9819,7 @@
     node_id: 1303
     ts: 1737162534263
     dur: 420259
+    monotonic_dur: 420259
     blocking_method: "void com.android.server.am.AppProfiler.collectPssInBackground()"
     blocked_method: "void com.android.server.am.ProcessProfileRecord.onProcessInactive(com.android.server.am.ProcessStatsService)"
     short_blocking_method: "com.android.server.am.AppProfiler.collectPssInBackground"
@@ -9495,6 +9856,7 @@
     node_id: 949
     ts: 1737122781871
     dur: 7301144
+    monotonic_dur: 7301144
     blocking_method: "void com.android.server.am.AppProfiler.collectPssInBackground()"
     blocked_method: "void com.android.server.am.ProcessRecord.setPid(int)"
     short_blocking_method: "com.android.server.am.AppProfiler.collectPssInBackground"
@@ -9526,6 +9888,7 @@
     node_id: 949
     ts: 1737122781871
     dur: 7301144
+    monotonic_dur: 7301144
     blocking_method: "void com.android.server.am.AppProfiler.collectPssInBackground()"
     blocked_method: "void com.android.server.am.ProcessRecord.setPid(int)"
     short_blocking_method: "com.android.server.am.AppProfiler.collectPssInBackground"
@@ -9556,6 +9919,7 @@
     node_id: 1546
     ts: 1737184711536
     dur: 932536
+    monotonic_dur: 932536
     blocking_method: "void com.android.server.am.AppProfiler.collectPssInBackground()"
     blocked_method: "void com.android.server.am.ProcessRecord.setPid(int)"
     short_blocking_method: "com.android.server.am.AppProfiler.collectPssInBackground"
@@ -9586,6 +9950,7 @@
     node_id: 15380
     ts: 1740031570180
     dur: 341236
+    monotonic_dur: 341236
     blocking_method: "void com.android.server.am.OomAdjuster.performUpdateOomAdjPendingTargetsLocked(java.lang.String)"
     blocked_method: "void com.android.server.am.ActivityManagerService$LocalService.notifyNetworkPolicyRulesUpdated(int, long)"
     short_blocking_method: "com.android.server.am.OomAdjuster.performUpdateOomAdjPendingTargetsLocked"
@@ -9606,6 +9971,7 @@
     node_id: 2256
     ts: 1737229788262
     dur: 1864661
+    monotonic_dur: 1864661
     blocking_method: "void com.android.server.am.OomAdjuster.updateOomAdjLocked(java.lang.String)"
     blocked_method: "boolean com.android.server.am.ActivityManagerService.isUidActive(int, java.lang.String)"
     short_blocking_method: "com.android.server.am.OomAdjuster.updateOomAdjLocked"
@@ -9643,6 +10009,7 @@
     node_id: 2202
     ts: 1737228235050
     dur: 70781
+    monotonic_dur: 70781
     blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9673,6 +10040,7 @@
     node_id: 2352
     ts: 1737239594398
     dur: 5000
+    monotonic_dur: 5000
     blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9698,6 +10066,7 @@
     node_id: 2137
     ts: 1737227163556
     dur: 7177
+    monotonic_dur: 7177
     blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9723,6 +10092,7 @@
     node_id: 2477
     ts: 1737245633067
     dur: 8154
+    monotonic_dur: 8154
     blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9748,6 +10118,7 @@
     node_id: 1955
     ts: 1737221116248
     dur: 5019
+    monotonic_dur: 5019
     blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9773,6 +10144,7 @@
     node_id: 2249
     ts: 1737229615862
     dur: 9541
+    monotonic_dur: 9541
     blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
     blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
     short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9798,6 +10170,7 @@
     node_id: 1819
     ts: 1737213634830
     dur: 2487729
+    monotonic_dur: 2487729
     blocking_method: "void com.android.server.content.ContentService$ObserverNode$ObserverEntry.binderDied()"
     blocked_method: "void com.android.server.content.ContentService$ObserverNode$ObserverEntry.binderDied()"
     short_blocking_method: "com.android.server.content.ContentService$ObserverNode$ObserverEntry.binderDied"
@@ -9833,6 +10206,7 @@
     node_id: 1211
     ts: 1737145912664
     dur: 12262591
+    monotonic_dur: 12262591
     blocking_method: "void com.android.server.media.MediaSessionService.pushSession1Changed(int)"
     blocked_method: "java.util.List com.android.server.media.MediaSessionService$SessionManagerImpl.getSessions(android.content.ComponentName, int)"
     short_blocking_method: "com.android.server.media.MediaSessionService.pushSession1Changed"
@@ -9865,6 +10239,7 @@
     node_id: 1151
     ts: 1737141884094
     dur: 513114
+    monotonic_dur: 513114
     blocking_method: "void com.android.server.power.PowerManagerService.acquireWakeLockInternal(android.os.IBinder, int, int, java.lang.String, java.lang.String, android.os.WorkSource, java.lang.String, int, int, android.os.IWakeLockCallback)"
     blocked_method: "void com.android.server.power.PowerManagerService.handleSandman(int)"
     short_blocking_method: "com.android.server.power.PowerManagerService.acquireWakeLockInternal"
@@ -9895,6 +10270,7 @@
     node_id: 1161
     ts: 1737142534967
     dur: 5471
+    monotonic_dur: 5471
     blocking_method: "void com.android.server.power.PowerManagerService.acquireWakeLockInternal(android.os.IBinder, int, int, java.lang.String, java.lang.String, android.os.WorkSource, java.lang.String, int, int, android.os.IWakeLockCallback)"
     blocked_method: "void com.android.server.power.PowerManagerService.handleSandman(int)"
     short_blocking_method: "com.android.server.power.PowerManagerService.acquireWakeLockInternal"
@@ -9920,6 +10296,7 @@
     node_id: 14088
     ts: 1739952323311
     dur: 688213
+    monotonic_dur: 688213
     blocking_method: "void com.android.server.power.PowerManagerService.acquireWakeLockInternal(android.os.IBinder, int, int, java.lang.String, java.lang.String, android.os.WorkSource, java.lang.String, int, int, android.os.IWakeLockCallback)"
     blocked_method: "void com.android.server.power.PowerManagerService.handleSandman(int)"
     short_blocking_method: "com.android.server.power.PowerManagerService.acquireWakeLockInternal"
@@ -9945,6 +10322,7 @@
     node_id: 1301
     ts: 1737162328333
     dur: 419228
+    monotonic_dur: 419228
     blocking_method: "void com.android.server.power.PowerManagerService.releaseWakeLockInternal(android.os.IBinder, int)"
     blocked_method: "void com.android.server.power.PowerManagerService.handleSandman(int)"
     short_blocking_method: "com.android.server.power.PowerManagerService.releaseWakeLockInternal"
@@ -9975,6 +10353,7 @@
     node_id: 14247
     ts: 1739965200743
     dur: 59154
+    monotonic_dur: 59154
     blocking_method: "void com.android.server.power.PowerManagerService.releaseWakeLockInternal(android.os.IBinder, int)"
     blocked_method: "void com.android.server.power.PowerManagerService.handleSandman(int)"
     short_blocking_method: "com.android.server.power.PowerManagerService.releaseWakeLockInternal"
@@ -9996,6 +10375,7 @@
     node_id: 956
     ts: 1737123891932
     dur: 17577143
+    monotonic_dur: 17577143
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "int com.android.server.am.ActivityManagerService.getMemoryTrimLevel()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -10017,6 +10397,7 @@
     node_id: 983
     ts: 1737128030991
     dur: 13677637
+    monotonic_dur: 13677637
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -10038,6 +10419,7 @@
     node_id: 1307
     ts: 1737162807202
     dur: 3588216
+    monotonic_dur: 3588216
     blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
     blocked_method: "boolean com.android.server.am.ActivityManagerService.unbindService(android.app.IServiceConnection)"
     short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
diff --git a/test/trace_processor/diff_tests/metrics/camera/camera-ion-mem-trace_android_camera_unagg.out b/test/trace_processor/diff_tests/metrics/camera/camera-ion-mem-trace_android_camera_unagg.out
index b690d13..84dd261 100644
--- a/test/trace_processor/diff_tests/metrics/camera/camera-ion-mem-trace_android_camera_unagg.out
+++ b/test/trace_processor/diff_tests/metrics/camera/camera-ion-mem-trace_android_camera_unagg.out
@@ -72687,4 +72687,12 @@
     dma_val: 322318336.0
     value: 1277186048.0
   }
+  gc_rss_and_dma {
+    ts: 790258000000
+    gca_rss_val: 622112768.0
+    hal_rss_val: 327274496.0
+    cameraserver_rss_val: 5480448.0
+    dma_val: 0.0
+    value: 954867712.0
+  }
 }
diff --git a/test/trace_processor/diff_tests/metrics/camera/tests.py b/test/trace_processor/diff_tests/metrics/camera/tests.py
index 43a9f86..fecb492 100644
--- a/test/trace_processor/diff_tests/metrics/camera/tests.py
+++ b/test/trace_processor/diff_tests/metrics/camera/tests.py
@@ -30,7 +30,7 @@
           gc_rss_and_dma {
             min: 47779840.0
             max: 2536079360.0
-            avg: 1464706457.7379363
+            avg: 1464706457.7348418
           }
         }
         """))
diff --git a/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py b/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
index c2336ce..70dec5c 100644
--- a/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
+++ b/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
@@ -458,4 +458,76 @@
             }
           }
         }
+        """))
+
+  def test_has_descendant_slice_with_name_true(self):
+    return DiffTestBlueprint(
+        # We need a trace with a large number of non-chrome slices, so that the
+        # reliable range is affected by their filtering.
+        trace=DataPath('chrome_input_with_frame_view.pftrace'),
+        query="""
+        INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+        SELECT
+          _HAS_DESCENDANT_SLICE_WITH_NAME(
+            (SELECT id from slice where dur = 46046000),
+            'SwapEndToPresentationCompositorFrame') AS has_descendant;
+        """,
+        out=Csv("""
+        "has_descendant"
+        1
+        """))
+
+  def test_has_descendant_slice_with_name_false(self):
+    return DiffTestBlueprint(
+        # We need a trace with a large number of non-chrome slices, so that the
+        # reliable range is affected by their filtering.
+        trace=DataPath('chrome_input_with_frame_view.pftrace'),
+        query="""
+        INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+        SELECT
+          _HAS_DESCENDANT_SLICE_WITH_NAME(
+            (SELECT id from slice where dur = 11666000),
+            'SwapEndToPresentationCompositorFrame') AS has_descendant;
+        """,
+        out=Csv("""
+        "has_descendant"
+        0
+        """))
+
+  def test_descendant_slice_null(self):
+    return DiffTestBlueprint(
+        # We need a trace with a large number of non-chrome slices, so that the
+        # reliable range is affected by their filtering.
+        trace=DataPath('chrome_input_with_frame_view.pftrace'),
+        query="""
+        INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+        SELECT
+          _DESCENDANT_SLICE_END(
+            (SELECT id from slice where dur = 11666000),
+            'SwapEndToPresentationCompositorFrame') AS end_ts;
+        """,
+        out=Csv("""
+        "end_ts"
+        "[NULL]"
+        """))
+
+  def test_descendant_slice(self):
+    return DiffTestBlueprint(
+        # We need a trace with a large number of non-chrome slices, so that the
+        # reliable range is affected by their filtering.
+        trace=DataPath('chrome_input_with_frame_view.pftrace'),
+        query="""
+        INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+        SELECT
+          _DESCENDANT_SLICE_END(
+            (SELECT id from slice where dur = 46046000),
+            'SwapEndToPresentationCompositorFrame') AS end_ts;
+        """,
+        out=Csv("""
+        "end_ts"
+        174797566610797
         """))
\ No newline at end of file
diff --git a/test/trace_processor/diff_tests/metrics/graphics/gpu_frequency_metric.textproto b/test/trace_processor/diff_tests/metrics/graphics/gpu_frequency_metric.textproto
index 8f0710f..3825a15 100644
--- a/test/trace_processor/diff_tests/metrics/graphics/gpu_frequency_metric.textproto
+++ b/test/trace_processor/diff_tests/metrics/graphics/gpu_frequency_metric.textproto
@@ -42,7 +42,7 @@
       }
     }
     event {
-      timestamp: 200005999999
+      timestamp: 200006000000
       pid: 527
       gpu_frequency {
         gpu_id: 0
diff --git a/test/trace_processor/diff_tests/metrics/graphics/tests.py b/test/trace_processor/diff_tests/metrics/graphics/tests.py
index f5bb896..28a1f66 100644
--- a/test/trace_processor/diff_tests/metrics/graphics/tests.py
+++ b/test/trace_processor/diff_tests/metrics/graphics/tests.py
@@ -101,7 +101,7 @@
           }
           mem_max: 4
           mem_min: 1
-          mem_avg: 2
+          mem_avg: 1
         }
         """))
 
diff --git a/test/trace_processor/diff_tests/parser/parsing/android_sched_and_ps_stats.out b/test/trace_processor/diff_tests/parser/parsing/android_sched_and_ps_stats.out
index 17268dc..e1542c5 100644
--- a/test/trace_processor/diff_tests/parser/parsing/android_sched_and_ps_stats.out
+++ b/test/trace_processor/diff_tests/parser/parsing/android_sched_and_ps_stats.out
@@ -143,14 +143,14 @@
 "ftrace_cpu_overrun_end",5,"info","trace",0
 "ftrace_cpu_overrun_end",6,"info","trace",0
 "ftrace_cpu_overrun_end",7,"info","trace",0
-"ftrace_cpu_overrun_delta",0,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",1,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",2,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",3,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",4,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",5,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",6,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",7,"data_loss","trace",0
+"ftrace_cpu_overrun_delta",0,"info","trace",0
+"ftrace_cpu_overrun_delta",1,"info","trace",0
+"ftrace_cpu_overrun_delta",2,"info","trace",0
+"ftrace_cpu_overrun_delta",3,"info","trace",0
+"ftrace_cpu_overrun_delta",4,"info","trace",0
+"ftrace_cpu_overrun_delta",5,"info","trace",0
+"ftrace_cpu_overrun_delta",6,"info","trace",0
+"ftrace_cpu_overrun_delta",7,"info","trace",0
 "ftrace_cpu_read_events_begin",0,"info","trace",0
 "ftrace_cpu_read_events_begin",1,"info","trace",0
 "ftrace_cpu_read_events_begin",2,"info","trace",0
diff --git a/test/trace_processor/diff_tests/parser/power/dvfs_metric.textproto b/test/trace_processor/diff_tests/parser/power/dvfs_metric.textproto
index 8301519..4472456 100644
--- a/test/trace_processor/diff_tests/parser/power/dvfs_metric.textproto
+++ b/test/trace_processor/diff_tests/parser/power/dvfs_metric.textproto
@@ -42,7 +42,7 @@
       }
     }
     event {
-      timestamp: 200005999999
+      timestamp: 200006000000
       pid: 527
       clock_set_rate {
         name: "domain@1"
diff --git a/test/trace_processor/diff_tests/parser/profiling/tests_heap_graph.py b/test/trace_processor/diff_tests/parser/profiling/tests_heap_graph.py
index 62b0c43..3eead2a 100644
--- a/test/trace_processor/diff_tests/parser/profiling/tests_heap_graph.py
+++ b/test/trace_processor/diff_tests/parser/profiling/tests_heap_graph.py
@@ -207,6 +207,19 @@
         """,
         out=Path('heap_graph_object.out'))
 
+  def test_heap_graph_object_reference_set_id(self):
+    return DiffTestBlueprint(
+        trace=Path('heap_graph.textproto'),
+        query="""
+        SELECT o.reference_set_id
+        FROM heap_graph_object o
+        WHERE o.reference_set_id = 3
+        """,
+        out=Csv('''
+          "reference_set_id"
+          3
+        '''))
+
   def test_heap_graph_reference_2(self):
     return DiffTestBlueprint(
         trace=Path('heap_graph.textproto'),
diff --git a/test/trace_processor/diff_tests/stdlib/android/tests.py b/test/trace_processor/diff_tests/stdlib/android/tests.py
index 5df48e0..23ae137 100644
--- a/test/trace_processor/diff_tests/stdlib/android/tests.py
+++ b/test/trace_processor/diff_tests/stdlib/android/tests.py
@@ -317,8 +317,8 @@
       LIMIT 1;
       """,
         out=Csv("""
-        "parent_id","blocking_method","blocked_method","short_blocking_method","short_blocked_method","blocking_src","blocked_src","waiter_count","blocked_utid","blocked_thread_name","blocking_utid","blocking_thread_name","blocking_tid","upid","process_name","id","ts","dur","track_id","is_blocked_thread_main","blocked_thread_tid","is_blocking_thread_main","blocking_thread_tid","binder_reply_id","binder_reply_ts","binder_reply_tid","pid","child_id"
-        949,"void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()","int com.android.server.am.ActivityManagerService.getMemoryTrimLevel()","com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied","com.android.server.am.ActivityManagerService.getMemoryTrimLevel","ActivityManagerService.java:1478","ActivityManagerService.java:9183",1,250,"system_server",656,"binder:642_12",2720,250,"system_server",956,1737123891932,17577143,1215,1,642,0,2720,"[NULL]","[NULL]","[NULL]",642,"[NULL]"
+        "parent_id","blocking_method","blocked_method","short_blocking_method","short_blocked_method","blocking_src","blocked_src","waiter_count","blocked_utid","blocked_thread_name","blocking_utid","blocking_thread_name","blocking_tid","upid","process_name","id","ts","dur","monotonic_dur","track_id","is_blocked_thread_main","blocked_thread_tid","is_blocking_thread_main","blocking_thread_tid","binder_reply_id","binder_reply_ts","binder_reply_tid","pid","child_id"
+        949,"void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()","int com.android.server.am.ActivityManagerService.getMemoryTrimLevel()","com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied","com.android.server.am.ActivityManagerService.getMemoryTrimLevel","ActivityManagerService.java:1478","ActivityManagerService.java:9183",1,250,"system_server",656,"binder:642_12",2720,250,"system_server",956,1737123891932,17577143,17577143,1215,1,642,0,2720,"[NULL]","[NULL]","[NULL]",642,"[NULL]"
       """))
 
   def test_monitor_contention_graph(self):
@@ -541,6 +541,10 @@
           server_oom_score,
           client_ts,
           server_ts,
+          client_dur,
+          server_dur,
+          client_monotonic_dur,
+          server_monotonic_dur,
           aidl_ts,
           aidl_dur,
           is_sync,
@@ -554,17 +558,17 @@
         LIMIT 10;
       """,
         out=Csv("""
-        "aidl_name","client_process","server_process","client_thread","client_tid","server_tid","is_main_thread","client_oom_score","server_oom_score","client_ts","server_ts","aidl_ts","aidl_dur","is_sync","client_package_version_code","server_package_version_code","is_client_package_debuggable","is_server_package_debuggable"
-        "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736110278076,1736110435876,1736110692464,135281,1,33,"[NULL]",0,"[NULL]"
-        "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736111274404,1736111340019,1736111417370,249758,1,33,"[NULL]",0,"[NULL]"
-        "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736111874030,1736111923740,1736111994038,64535,1,33,"[NULL]",0,"[NULL]"
-        "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736112257185,1736112301639,1736112361927,133727,1,33,"[NULL]",0,"[NULL]"
-        "AIDL::java::IPackageManager::isProtectedBroadcast::server","com.android.systemui","system_server","ndroid.systemui",1253,657,1,-800,-900,1737108493015,1737125387579,1737125511194,24959,1,33,"[NULL]",0,"[NULL]"
-        "AIDL::java::IActivityManager::checkPermission::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737110161286,1737110746980,1737110799860,75563,1,33,"[NULL]",0,"[NULL]"
-        "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737123460104,1737123475761,1737123532124,48775,1,33,"[NULL]",0,"[NULL]"
-        "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737123982140,1737123994640,1737124033555,109797,1,33,"[NULL]",0,"[NULL]"
-        "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737124228451,1737124238356,1737124269922,24911,1,33,"[NULL]",0,"[NULL]"
-        "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737124369273,1737124378273,1737124406331,54810,1,33,"[NULL]",0,"[NULL]"
+        "aidl_name","client_process","server_process","client_thread","client_tid","server_tid","is_main_thread","client_oom_score","server_oom_score","client_ts","server_ts","client_dur","server_dur","client_monotonic_dur","server_monotonic_dur","aidl_ts","aidl_dur","is_sync","client_package_version_code","server_package_version_code","is_client_package_debuggable","is_server_package_debuggable"
+        "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736110278076,1736110435876,765487,462664,765487,462664,1736110692464,135281,1,33,"[NULL]",0,"[NULL]"
+        "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736111274404,1736111340019,481038,361607,481038,361607,1736111417370,249758,1,33,"[NULL]",0,"[NULL]"
+        "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736111874030,1736111923740,254494,159330,254494,159330,1736111994038,64535,1,33,"[NULL]",0,"[NULL]"
+        "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736112257185,1736112301639,309870,220751,309870,220751,1736112361927,133727,1,33,"[NULL]",0,"[NULL]"
+        "AIDL::java::IPackageManager::isProtectedBroadcast::server","com.android.systemui","system_server","ndroid.systemui",1253,657,1,-800,-900,1737108493015,1737125387579,17949987,163732,17949987,163732,1737125511194,24959,1,33,"[NULL]",0,"[NULL]"
+        "AIDL::java::IActivityManager::checkPermission::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737110161286,1737110746980,12677155,147315,12677155,147315,1737110799860,75563,1,33,"[NULL]",0,"[NULL]"
+        "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737123460104,1737123475761,447621,137704,447621,137704,1737123532124,48775,1,33,"[NULL]",0,"[NULL]"
+        "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737123982140,1737123994640,191006,164185,191006,164185,1737124033555,109797,1,33,"[NULL]",0,"[NULL]"
+        "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737124228451,1737124238356,88522,66721,88522,66721,1737124269922,24911,1,33,"[NULL]",0,"[NULL]"
+        "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737124369273,1737124378273,957260,95254,957260,95254,1737124406331,54810,1,33,"[NULL]",0,"[NULL]"
         """))
 
   def test_binder_outgoing_graph(self):
@@ -919,7 +923,7 @@
          "name","ts","value","dur"
          "domain@1 Frequency",200001000000,400000.000000,2000000
          "domain@1 Frequency",200003000000,1024000.000000,2000000
-         "domain@1 Frequency",200005000000,1024000.000000,1
+         "domain@1 Frequency",200005000000,1024000.000000,0
          """))
 
   def test_android_dvfs_counter_stats(self):
@@ -987,8 +991,8 @@
          """,
         out=Csv("""
          "name","max","min","dur","wgt_avg"
-         "bus_throughput Frequency",1014000.000000,553000.000000,4000000,783499.942375
-         "domain@1 Frequency",1024000.000000,400000.000000,4000000,712000.078000
+         "bus_throughput Frequency",1014000.000000,553000.000000,2000000,783500.000000
+         "domain@1 Frequency",1024000.000000,400000.000000,2000000,712000.000000
          """))
 
   def test_android_dvfs_counter_residency(self):
@@ -998,7 +1002,7 @@
             ftrace_events {
               cpu: 0
               event {
-                timestamp: 200001000001
+                timestamp: 200001000000
                 pid: 2
                 clock_set_rate {
                 name : "bus_throughput"
@@ -1006,7 +1010,7 @@
                 }
               }
               event {
-                timestamp: 200003000001
+                timestamp: 200003000000
                 pid: 2
                 clock_set_rate {
                   name: "bus_throughput"
@@ -1157,14 +1161,21 @@
 
   def test_freezer_events(self):
     return DiffTestBlueprint(
-        trace=DataPath('post_boot_trace.atr'),
+        trace=DataPath('freezer_trace.atr'),
         query="""
         INCLUDE PERFETTO MODULE android.freezer;
-        SELECT pid, ts, dur FROM android_freezer_events ORDER BY ts
+        SELECT pid, ts, dur, unfreeze_reason_int, unfreeze_reason_str FROM android_freezer_events ORDER BY ts
       """,
         out=Csv("""
-        "pid","ts","dur"
-        8361,588092720937,576298685
+        "pid","ts","dur","unfreeze_reason_int","unfreeze_reason_str"
+        6506,91266310231819,94699935803,"[NULL]","[NULL]"
+        3804,91266322277324,94687890298,"[NULL]","[NULL]"
+        3299,91281767065245,78699885147,6,"start_service"
+        5782,91296291190245,64718977377,"[NULL]","[NULL]"
+        6533,91296292403211,64717764411,"[NULL]","[NULL]"
+        4044,91296293188372,64716979250,"[NULL]","[NULL]"
+        4002,91296294215356,64715952266,"[NULL]","[NULL]"
+        3981,91296294804650,64715362972,"[NULL]","[NULL]"
         """))
 
   def test_service_bindings(self):
@@ -1209,3 +1220,38 @@
         0,"com.android.bluetooth","droid.bluetooth",7639,7639,571248973750,9874358,-700,"com.android.bluetooth","binder:7639_2",7672,7639,571871169647,6460322,"android.os.BinderProxy@7482132","android.bluetooth.IBluetooth","com.android.bluetooth/.btservice.AdapterService","[NULL]",4
         -700,"com.android.bluetooth","droid.bluetooth",7639,7639,572342110044,4874276,-700,"com.android.bluetooth","binder:7639_2",7672,7639,572466393291,1404185,"android.os.BinderProxy@ce5a6fc","android.media.browse.MediaBrowserService","com.android.bluetooth/.avrcpcontroller.BluetoothMediaBrowserService","[NULL]",10
       """))
+
+  def test_oom_adjuster_transitions(self):
+    return DiffTestBlueprint(
+        trace=DataPath('sched_wakeup_trace.atr'),
+        query="""
+        INCLUDE PERFETTO MODULE android.oom_adjuster;
+        SELECT
+        ts,
+        dur,
+        score,
+        bucket,
+        process_name,
+        oom_adj_ts,
+        oom_adj_dur,
+        oom_adj_thread_name,
+        oom_adj_reason,
+        oom_adj_trigger
+        FROM android_oom_adj_intervals
+        WHERE oom_adj_reason IS NOT NULL
+        ORDER BY ts
+        LIMIT 10
+      """,
+        out=Csv("""
+        "ts","dur","score","bucket","process_name","oom_adj_ts","oom_adj_dur","oom_adj_thread_name","oom_adj_reason","oom_adj_trigger"
+        1737065264829,701108081,925,"cached_app","com.android.providers.calendar",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737066678827,3470211742,935,"cached_app","com.android.imsserviceentitlement",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737066873002,3470017567,945,"cached_app","com.android.carrierconfig",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737067058812,3469831757,955,"cached_app_lmk_first","com.android.messaging",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737067246975,699224817,955,"cached_app_lmk_first","android.process.acore",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737068421919,3468468650,965,"cached_app_lmk_first","com.android.shell",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737068599673,697908135,965,"cached_app_lmk_first","android.process.media",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737068933602,3467956967,975,"cached_app_lmk_first","com.android.gallery3d",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737069091010,3467799559,975,"cached_app_lmk_first","com.android.packageinstaller",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+        1737069240534,3467650035,985,"cached_app_lmk_first","com.android.managedprovisioning",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+      """))
diff --git a/test/trace_processor/diff_tests/stdlib/counters/tests.py b/test/trace_processor/diff_tests/stdlib/counters/tests.py
new file mode 100644
index 0000000..270d074
--- /dev/null
+++ b/test/trace_processor/diff_tests/stdlib/counters/tests.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+# Copyright (C) 2024 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 a
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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 python.generators.diff_tests.testing import DataPath
+from python.generators.diff_tests.testing import Csv, TextProto
+from python.generators.diff_tests.testing import DiffTestBlueprint
+from python.generators.diff_tests.testing import TestSuite
+
+
+class StdlibCounterIntervals(TestSuite):
+
+  def test_intervals_counter_leading(self):
+    return DiffTestBlueprint(
+      trace=DataPath('counters.json'),
+        query="""
+        INCLUDE PERFETTO MODULE counters.intervals;
+
+        WITH
+          foo AS (
+            SELECT 0 AS id, 0 AS ts, 10 AS value, 1 AS track_id
+            UNION ALL
+            SELECT 1 AS id, 0 AS ts, 10 AS value, 2 AS track_id
+            UNION ALL
+            SELECT 2 AS id, 10 AS ts, 10 AS value, 1 AS track_id
+            UNION ALL
+            SELECT 3 AS id, 10 AS ts, 20 AS value, 2 AS track_id
+            UNION ALL
+            SELECT 4 AS id, 20 AS ts, 30 AS value, 1 AS track_id
+          )
+        SELECT * FROM counter_leading_intervals !(foo);
+        """,
+        out=Csv("""
+        "id","ts","track_id","dur","value"
+        0,0,1,20,10
+        4,20,1,19980,30
+        1,0,2,10,10
+        3,10,2,19990,20
+        """))
diff --git a/test/trace_processor/diff_tests/stdlib/slices/tests.py b/test/trace_processor/diff_tests/stdlib/slices/tests.py
index 9b565bb..e3db459 100644
--- a/test/trace_processor/diff_tests/stdlib/slices/tests.py
+++ b/test/trace_processor/diff_tests/stdlib/slices/tests.py
@@ -26,7 +26,7 @@
     return DiffTestBlueprint(
         trace=Path('trace.py'),
         query="""
-        INCLUDE PERFETTO MODULE common.slices;
+        INCLUDE PERFETTO MODULE slices.with_context;
 
         SELECT name, ts, dur, depth, thread_name, tid, process_name, pid
         FROM thread_slice;
@@ -40,7 +40,7 @@
     return DiffTestBlueprint(
         trace=Path('trace.py'),
         query="""
-        INCLUDE PERFETTO MODULE common.slices;
+        INCLUDE PERFETTO MODULE slices.with_context;
 
         SELECT name, ts, dur, depth, process_name, pid
         FROM process_slice;
@@ -67,77 +67,6 @@
       """))
 
   # Common functions
-  def test_has_descendant_slice_with_name_true(self):
-    return DiffTestBlueprint(
-        # We need a trace with a large number of non-chrome slices, so that the
-        # reliable range is affected by their filtering.
-        trace=DataPath('chrome_input_with_frame_view.pftrace'),
-        query="""
-        INCLUDE PERFETTO MODULE common.slices;
-
-        SELECT
-          HAS_DESCENDANT_SLICE_WITH_NAME(
-            (SELECT id from slice where dur = 46046000),
-            'SwapEndToPresentationCompositorFrame') AS has_descendant;
-        """,
-        out=Csv("""
-        "has_descendant"
-        1
-        """))
-
-  def test_has_descendant_slice_with_name_false(self):
-    return DiffTestBlueprint(
-        # We need a trace with a large number of non-chrome slices, so that the
-        # reliable range is affected by their filtering.
-        trace=DataPath('chrome_input_with_frame_view.pftrace'),
-        query="""
-        INCLUDE PERFETTO MODULE common.slices;
-
-        SELECT
-          HAS_DESCENDANT_SLICE_WITH_NAME(
-            (SELECT id from slice where dur = 11666000),
-            'SwapEndToPresentationCompositorFrame') AS has_descendant;
-        """,
-        out=Csv("""
-        "has_descendant"
-        0
-        """))
-
-  def test_descendant_slice_null(self):
-    return DiffTestBlueprint(
-        # We need a trace with a large number of non-chrome slices, so that the
-        # reliable range is affected by their filtering.
-        trace=DataPath('chrome_input_with_frame_view.pftrace'),
-        query="""
-        INCLUDE PERFETTO MODULE common.slices;
-
-        SELECT
-          DESCENDANT_SLICE_END(
-            (SELECT id from slice where dur = 11666000),
-            'SwapEndToPresentationCompositorFrame') AS end_ts;
-        """,
-        out=Csv("""
-        "end_ts"
-        "[NULL]"
-        """))
-
-  def test_descendant_slice(self):
-    return DiffTestBlueprint(
-        # We need a trace with a large number of non-chrome slices, so that the
-        # reliable range is affected by their filtering.
-        trace=DataPath('chrome_input_with_frame_view.pftrace'),
-        query="""
-        INCLUDE PERFETTO MODULE common.slices;
-
-        SELECT
-          DESCENDANT_SLICE_END(
-            (SELECT id from slice where dur = 46046000),
-            'SwapEndToPresentationCompositorFrame') AS end_ts;
-        """,
-        out=Csv("""
-        "end_ts"
-        174797566610797
-        """))
 
   def test_slice_flattened(self):
     return DiffTestBlueprint(
diff --git a/tools/check_sql_metrics.py b/tools/check_sql_metrics.py
index b577b43..73f0d70 100755
--- a/tools/check_sql_metrics.py
+++ b/tools/check_sql_metrics.py
@@ -48,7 +48,7 @@
     '/chrome/gesture_jank.sql': [
         '{{prefix}}_jank_maybe_null_prev_and_next_without_precompute'
     ],
-    '/experimental/frame_times.sql': ['DisplayCompositorPresentationEvents']
+    '/experimental/frame_times.sql': ['DisplayCompositorPresentationEvents'],
 }
 
 
diff --git a/tools/check_sql_modules.py b/tools/check_sql_modules.py
index 7f6f81c..b4ffc1f 100755
--- a/tools/check_sql_modules.py
+++ b/tools/check_sql_modules.py
@@ -34,9 +34,8 @@
 
 # Allowlist path are relative to the stdlib root.
 CREATE_TABLE_ALLOWLIST = {
-    '/android/binder.sql': [
-        '_oom_score'
-    ],
+    '/prelude/trace_bounds.sql': ['trace_bounds'],
+    '/android/binder.sql': ['_oom_score'],
     '/android/monitor_contention.sql': [
         '_isolated', 'android_monitor_contention_chain',
         'android_monitor_contention'
@@ -91,6 +90,11 @@
         sql = f.read()
 
       parsed = parse_file(rel_path, sql)
+
+      # Some modules (i.e. `deprecated`) should not be checked.
+      if not parsed:
+        continue
+
       modules.append((path, sql, parsed))
 
       if args.verbose:
diff --git a/tools/extract_linux_syscall_tables b/tools/extract_linux_syscall_tables
index 89889b2..59e33d0 100755
--- a/tools/extract_linux_syscall_tables
+++ b/tools/extract_linux_syscall_tables
@@ -11,7 +11,7 @@
 SELF_PATH = os.path.relpath(__file__, PROJECT_ROOT).replace('\\', '/')
 
 syscalls = {}
-archs = ['aarch32', 'aarch64', 'armeabi', 'x86', 'x86_64']
+archs = ['arm64', 'arm32', 'x86', 'x86_64']
 
 
 def print_tables():
@@ -83,7 +83,7 @@
 
 
 def Main():
-  KSRC = 'https://raw.githubusercontent.com/torvalds/linux/v4.20/'
+  KSRC = 'https://raw.githubusercontent.com/torvalds/linux/v6.7/'
 
   response = urlopen(KSRC + 'arch/x86/entry/syscalls/syscall_64.tbl')
   syscalls['x86_64'] = parse_tlb(response.read().decode())
@@ -92,17 +92,14 @@
   syscalls['x86'] = parse_tlb(response.read().decode())
 
   response = urlopen(KSRC + 'arch/arm/tools/syscall.tbl')
-  syscalls['armeabi'] = parse_tlb(response.read().decode())
-
-  response = urlopen(KSRC + 'arch/arm64/include/asm/unistd32.h')
-  syscalls['aarch32'] = parse_def(response.read().decode())
+  syscalls['arm32'] = parse_tlb(response.read().decode())
 
   # From:
   # arch/arm64/include/asm/unistd.h
   #   -> arch/arm64/include/uapi/asm/unistd.h
   #     -> include/uapi/asm-generic/unistd.h
   response = urlopen(KSRC + 'include/uapi/asm-generic/unistd.h')
-  syscalls['aarch64'] = parse_def(response.read().decode())
+  syscalls['arm64'] = parse_def(response.read().decode())
 
   dst_file = os.path.join(PROJECT_ROOT, 'src', 'kernel_utils',
                           'syscall_table_generated.h')
diff --git a/tools/gen_bazel b/tools/gen_bazel
index 6330000..31c127a 100755
--- a/tools/gen_bazel
+++ b/tools/gen_bazel
@@ -64,6 +64,7 @@
 public_targets = [
     '//:libperfetto_client_experimental',
     '//src/perfetto_cmd:perfetto',
+    '//src/shared_lib:libperfetto_c',
     '//src/traced/probes:traced_probes',
     '//src/traced/service:traced',
     '//src/trace_processor:trace_processor_shell',
@@ -173,6 +174,15 @@
   }
 }
 
+# Defines required for Bazel.
+bazel_required_defines = [
+  "PERFETTO_SHLIB_SDK_IMPLEMENTATION"
+]
+
+# Filter defines that appear in the bazel build file to only those that bazel requires.
+def filter_defines(defines):
+  return [d for d in defines if d in bazel_required_defines]
+
 
 def gen_version_header(target):
   label = BazelLabel(get_bazel_label_name(target.name), 'perfetto_genrule')
@@ -322,6 +332,7 @@
     self.visibility: Union[List[str], str] = []
     self.srcs: Union[List[str], str] = []
     self.hdrs = []
+    self.defines = []
     self.data = []
     self.deps = []
     self.external_deps = []
@@ -348,8 +359,8 @@
     res += '%s(\n' % self.type
     any_deps = len(self.deps) + len(self.external_deps) > 0
     ORD = [
-        'name', 'srcs', 'hdrs', 'visibility', 'data', 'deps', 'outs', 'cmd',
-        'tools', 'exports', 'main', 'python_version'
+        'name', 'srcs', 'hdrs', 'defines', 'visibility', 'data', 'deps', 'outs',
+        'cmd', 'tools', 'exports', 'main', 'python_version'
     ]
     hasher = lambda x: sum((99,) + tuple(ord(c) for c in x))
     key_sorter = lambda kv: ORD.index(kv[0]) if kv[0] in ORD else hasher(kv[0])
@@ -624,7 +635,7 @@
   elif gn_target.type == 'executable':
     bazel_type = 'perfetto_cc_binary'
   elif gn_target.type == 'shared_library':
-    bazel_type = 'perfetto_cc_binary'
+    bazel_type = 'perfetto_cc_library'
   elif gn_target.type == 'static_library':
     bazel_type = 'perfetto_cc_library'
   elif gn_target.type == 'source_set':
@@ -670,6 +681,10 @@
         label.hdrs += [name]
       else:
         label.srcs += [name]
+
+      # Add defines from all transitive dependencies.
+      label.defines += trans_dep.defines
+
     for dep in sorted(gn_target.non_proto_or_source_set_deps()):
       dep_name = dep.name
       if dep_name.startswith('//gn:'):
@@ -684,6 +699,7 @@
         label.external_deps += external_deps[dep_name]
       else:
         label.deps += [':' + get_bazel_label_name(dep_name)]
+
     label.deps += [
         ':' + get_bazel_label_name(x.name)
         for x in gn_target.transitive_cpp_proto_deps()
@@ -698,6 +714,7 @@
 
   label.deps = sorted(label.deps)
   label.hdrs = sorted(label.hdrs)
+  label.defines = sorted(filter_defines(set(label.defines)))
   return [label]
 
 
diff --git a/tools/gen_cc_proto_descriptor.py b/tools/gen_cc_proto_descriptor.py
index 0c2dc66..45354b1 100755
--- a/tools/gen_cc_proto_descriptor.py
+++ b/tools/gen_cc_proto_descriptor.py
@@ -68,7 +68,7 @@
 
 namespace perfetto {{
 
-constexpr std::array<uint8_t, {size}> k{proto_name}Descriptor{{
+constexpr inline std::array<uint8_t, {size}> k{proto_name}Descriptor{{
 {binary}}};
 
 }}  // namespace perfetto
diff --git a/tools/gen_stdlib_docs_json.py b/tools/gen_stdlib_docs_json.py
index 513b932..8ae6044 100755
--- a/tools/gen_stdlib_docs_json.py
+++ b/tools/gen_stdlib_docs_json.py
@@ -71,6 +71,11 @@
     import_key = path.split(".sql")[0].replace("/", ".")
 
     docs = parse_file(path, sql)
+
+    # Some modules (i.e `deprecated`) should not generate docs.
+    if not docs:
+      continue
+
     if len(docs.errors) > 0:
       for e in docs.errors:
         print(e)
diff --git a/tools/install-build-deps b/tools/install-build-deps
index 802ae9e..b27e8ea 100755
--- a/tools/install-build-deps
+++ b/tools/install-build-deps
@@ -165,13 +165,13 @@
     # tools/clang/scripts/update.py.
     Dependency(
         'buildtools/linux64/clang.tgz',
-        'https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-16-init-8697-g60809cd2-1.tgz',
-        '5ae35f85e0d32136795c6b223bf64263d46678dd4a24fea4e9039e58a32670de',
+        'https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-18-init-17730-gf670112a-5.tgz',
+        'ce6201b728ea485d4b116aa3b5e8ae3b34ee2775f25924c5714fdbe42fb2b787',
         'linux', 'x64'),
     Dependency(
         'buildtools/win/clang.tgz',
-        'https://commondatastorage.googleapis.com/chromium-browser-clang/Win/clang-llvmorg-16-init-8697-g60809cd2-1.tgz',
-        '086faec822acba5b9c0308c6a8be34424031027d757efa2b81805aed18ffc521',
+        'https://commondatastorage.googleapis.com/chromium-browser-clang/Win/clang-llvmorg-18-init-17730-gf670112a-5.tgz',
+        '972011cc8a5bc5d5fbe08773089058a264ee0e19af019df28f0972ee9bd0493f',
         'windows', 'x64'),
 ]
 
@@ -221,8 +221,8 @@
     # From https://github.com/ianlancetaylor/libbacktrace/archive/177940370e4a6b2509e92a0aaa9749184e64af43.zip
     Dependency(
         'buildtools/libbacktrace.zip',
-        'https://storage.googleapis.com/perfetto/libbacktrace-177940370e4a6b2509e92a0aaa9749184e64af43.zip',
-        '21ac9a4209f7aeef766c482be53a7fa365063c031c7077e2070b491202983b31',
+        'https://storage.googleapis.com/perfetto/libbacktrace-14818b7783eeb9a56c3f0fca78cefd3143f8c5f6.zip',
+        '0d09295938155aa84d9a6049f63df8cd2def3a28302b3550ea3ead9100b3d086',
         'all', 'all'),
 
     # Sqlite for the trace processing library.
diff --git a/ui/release/channels.json b/ui/release/channels.json
index 8e7a8cf..778c4d8 100644
--- a/ui/release/channels.json
+++ b/ui/release/channels.json
@@ -6,7 +6,7 @@
     },
     {
       "name": "canary",
-      "rev": "ed568855bbbfffe3fb099cd5f3d0096f1e4aa268"
+      "rev": "f62b11e6b5d34d0b0f1af3d60eb4d40a57b652b6"
     },
     {
       "name": "autopush",
diff --git a/ui/src/assets/details.scss b/ui/src/assets/details.scss
index 2bd55e5..f3e529a 100644
--- a/ui/src/assets/details.scss
+++ b/ui/src/assets/details.scss
@@ -63,6 +63,10 @@
       .pf-tab-title {
         margin: 0px 4px;
         overflow: hidden;
+
+        .pf-nocontent {
+          font-weight: lighter;
+        }
       }
     }
   }
diff --git a/ui/src/assets/plugins_page.scss b/ui/src/assets/plugins_page.scss
index 3000353..0312323 100644
--- a/ui/src/assets/plugins_page.scss
+++ b/ui/src/assets/plugins_page.scss
@@ -33,7 +33,7 @@
 
   .pf-plugins-grid {
     display: inline-grid;
-    grid-template-columns: auto auto auto;
+    grid-template-columns: repeat(6, auto);
     row-gap: 6px;
     column-gap: 10px;
   }
diff --git a/ui/src/common/cache_manager.ts b/ui/src/common/cache_manager.ts
index 41faf66..1eab53f 100644
--- a/ui/src/common/cache_manager.ts
+++ b/ui/src/common/cache_manager.ts
@@ -42,7 +42,7 @@
   try {
     const cache = await getCache();
     if (cache === undefined) return false;  // Cache storage not supported.
-    return cache.delete(key);
+    return await cache.delete(key);
   } catch (_) {
     // TODO(288483453): Reinstate:
     // return ignoreCacheUnactionableErrors(e, false);
@@ -54,7 +54,7 @@
   try {
     const cache = await getCache();
     if (cache === undefined) return;  // Cache storage not supported.
-    cache.put(key, value);
+    await cache.put(key, value);
   } catch (_) {
     // TODO(288483453): Reinstate:
     // ignoreCacheUnactionableErrors(e, undefined);
@@ -65,7 +65,7 @@
   try {
     const cache = await getCache();
     if (cache === undefined) return undefined;  // Cache storage not supported.
-    return cache.match(key);
+    return await cache.match(key);
   } catch (_) {
     // TODO(288483453): Reinstate:
     // ignoreCacheUnactionableErrors(e, undefined);
@@ -77,7 +77,7 @@
   try {
     const cache = await getCache();
     if (cache === undefined) return [];  // Cache storage not supported.
-    return cache.keys();
+    return await cache.keys();
   } catch (e) {
     // TODO(288483453): Reinstate:
     // return ignoreCacheUnactionableErrors(e, []);
diff --git a/ui/src/common/default_plugins.ts b/ui/src/common/default_plugins.ts
new file mode 100644
index 0000000..1a48e28
--- /dev/null
+++ b/ui/src/common/default_plugins.ts
@@ -0,0 +1,58 @@
+// Copyright (C) 2024 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.
+
+// Plugins in this list will run by default when users boot up the UI.
+// Users may choose to enable plugins which are not in this list, but they will
+// need to do this manually.
+// In order to get a plugin into this list it must:
+// - Use only the available plugin API (no hacks).
+// - Follow naming conventions for tracks and plugins.
+// - Not directly rely on any other plugins.
+// - Be approved by one of Perfetto UI owners.
+export const defaultPlugins = [
+  'dev.perfetto.AndroidBinderVizPlugin',
+  'dev.perfetto.AndroidClientServer',
+  'dev.perfetto.AndroidCujs',
+  'dev.perfetto.AndroidLongBatteryTracing',
+  'dev.perfetto.AndroidNetwork',
+  'dev.perfetto.AndroidPerf',
+  'dev.perfetto.AndroidPerfTraceCounters',
+  'dev.perfetto.BookmarkletApi',
+  'dev.perfetto.CoreCommands',
+  'dev.perfetto.LargeScreensPerf',
+  'perfetto.AndroidLog',
+  'perfetto.Annotation',
+  'perfetto.AsyncSlices',
+  'perfetto.ChromeScrollJank',
+  'perfetto.ChromeSlices',
+  'perfetto.Counter',
+  'perfetto.CpuFreq',
+  'perfetto.CpuProfile',
+  'perfetto.CpuSlices',
+  'perfetto.CriticalUserInteraction',
+  'perfetto.CustomSqlTrack',
+  'perfetto.DebugSlices',
+  'perfetto.Flows',
+  'perfetto.Frames',
+  'perfetto.FtraceRaw',
+  'perfetto.HeapProfile',
+  'perfetto.NullTrack',
+  'perfetto.PerfSamplesProfile',
+  'perfetto.PivotTable',
+  'perfetto.ProcessSummary',
+  'perfetto.Sched',
+  'perfetto.Screenshots',
+  'perfetto.ThreadState',
+  'perfetto.VisualisedArgs',
+];
diff --git a/ui/src/common/plugins.ts b/ui/src/common/plugins.ts
index 788dbcd..fc996a2 100644
--- a/ui/src/common/plugins.ts
+++ b/ui/src/common/plugins.ts
@@ -42,6 +42,10 @@
 import {Registry} from './registry';
 import {SCROLLING_TRACK_GROUP} from './state';
 import {addQueryResultsTab} from '../frontend/query_result_tab';
+import {Flag, featureFlags} from '../core/feature_flags';
+import {assertExists} from '../base/logging';
+import {raf} from '../core/raf_scheduler';
+import {defaultPlugins} from './default_plugins';
 
 // Every plugin gets its own PluginContext. This is how we keep track
 // what each plugin is doing and how we can blame issues on particular
@@ -139,6 +143,11 @@
     this.trash.add(unregister);
   }
 
+  addDefaultTab(uri: string): void {
+    const remove = globals.tabManager.addDefaultTab(uri);
+    this.trash.add(remove);
+  }
+
   registerDetailsPanel(section: DetailsPanel): void {
     if (!this.alive) return;
 
@@ -318,10 +327,11 @@
   }
 }
 
-interface PluginDetails {
+export interface PluginDetails {
   plugin: Plugin;
   context: PluginContext&Disposable;
   traceContext?: PluginContextTraceImpl;
+  previousOnTraceLoadTimeMillis?: number;
 }
 
 function isPluginClass(v: unknown): v is PluginClass {
@@ -345,15 +355,68 @@
 
 export class PluginManager {
   private registry: PluginRegistry;
-  private plugins: Map<string, PluginDetails>;
+  private _plugins: Map<string, PluginDetails>;
   private engine?: Engine;
+  private flags = new Map<string, Flag>();
 
   constructor(registry: PluginRegistry) {
     this.registry = registry;
-    this.plugins = new Map();
+    this._plugins = new Map();
   }
 
-  activatePlugin(id: string): void {
+  get plugins(): Map<string, PluginDetails> {
+    return this._plugins;
+  }
+
+  // Must only be called once on startup
+  async initialize(): Promise<void> {
+    for (const plugin of pluginRegistry.values()) {
+      const id = `plugin_${plugin.pluginId}`;
+      const name = `Plugin: ${plugin.pluginId}`;
+      const flag = featureFlags.register({
+        id,
+        name,
+        description: `Overrides '${id}' plugin.`,
+        defaultValue: defaultPlugins.includes(plugin.pluginId),
+      });
+      this.flags.set(plugin.pluginId, flag);
+      if (flag.get()) {
+        await this.activatePlugin(plugin.pluginId);
+      }
+    }
+  }
+
+  /**
+   * Enable plugin flag - i.e. configure a plugin to start on boot.
+   * @param id The ID of the plugin.
+   * @param now Optional: If true, also activate the plugin now.
+   */
+  async enablePlugin(id: string, now?: boolean): Promise<void> {
+    const flag = this.flags.get(id);
+    if (flag) {
+      flag.set(true);
+    }
+    now && await this.activatePlugin(id);
+  }
+
+  /**
+   * Disable plugin flag - i.e. configure a plugin not to start on boot.
+   * @param id The ID of the plugin.
+   * @param now Optional: If true, also deactivate the plugin now.
+   */
+  async disablePlugin(id: string, now?: boolean): Promise<void> {
+    const flag = this.flags.get(id);
+    if (flag) {
+      flag.set(false);
+    }
+    now && await this.deactivatePlugin(id);
+  }
+
+  /**
+   * Start a plugin just for this session. This setting is not persisted.
+   * @param id The ID of the plugin to start.
+   */
+  async activatePlugin(id: string): Promise<void> {
     if (this.isActive(id)) {
       return;
     }
@@ -373,53 +436,89 @@
     // If a trace is already loaded when plugin is activated, make sure to
     // call onTraceLoad().
     if (this.engine) {
-      this.doPluginTraceLoad(pluginDetails, this.engine, id);
+      await doPluginTraceLoad(pluginDetails, this.engine, id);
     }
 
-    this.plugins.set(id, pluginDetails);
+    this._plugins.set(id, pluginDetails);
+
+    raf.scheduleFullRedraw();
   }
 
-  deactivatePlugin(id: string): void {
+  /**
+   * Stop a plugin just for this session. This setting is not persisted.
+   * @param id The ID of the plugin to stop.
+   */
+  async deactivatePlugin(id: string): Promise<void> {
     const pluginDetails = this.getPluginContext(id);
     if (pluginDetails === undefined) {
       return;
     }
     const {context, plugin} = pluginDetails;
 
-    maybeDoPluginTraceUnload(pluginDetails);
+    await doPluginTraceUnload(pluginDetails);
 
     plugin.onDeactivate && plugin.onDeactivate(context);
     context.dispose();
 
-    this.plugins.delete(id);
+    this._plugins.delete(id);
+
+    raf.scheduleFullRedraw();
+  }
+
+  /**
+   * Restore all plugins enable/disabled flags to their default values.
+   * @param now Optional: Also activates/deactivates plugins to match flag
+   * settings.
+   */
+  async restoreDefaults(now?: boolean): Promise<void> {
+    for (const plugin of pluginRegistry.values()) {
+      const pluginId = plugin.pluginId;
+      const flag = assertExists(this.flags.get(pluginId));
+      flag.reset();
+      if (now) {
+        if (flag.get()) {
+          await this.activatePlugin(plugin.pluginId);
+        } else {
+          await this.deactivatePlugin(plugin.pluginId);
+        }
+      }
+    }
   }
 
   isActive(pluginId: string): boolean {
     return this.getPluginContext(pluginId) !== undefined;
   }
 
+  isEnabled(pluginId: string): boolean {
+    return Boolean(this.flags.get(pluginId)?.get());
+  }
+
   getPluginContext(pluginId: string): PluginDetails|undefined {
-    return this.plugins.get(pluginId);
+    return this._plugins.get(pluginId);
   }
 
   async onTraceLoad(engine: Engine): Promise<void> {
     this.engine = engine;
-    const plugins = Array.from(this.plugins.entries());
-    const promises = plugins.map(([id, pluginDetails]) => {
-      return this.doPluginTraceLoad(pluginDetails, engine, id);
-    });
-    await Promise.all(promises);
+    const plugins = Array.from(this._plugins.entries());
+    // Awaiting all plugins in parallel will skew timing data as later plugins
+    // will spend most of their time waiting for earlier plugins to load.
+    // Running in parallel will have very little performance benefit assuming
+    // most plugins use the same engine, which can only process one query at a
+    // time.
+    for (const [id, pluginDetails] of plugins) {
+      await doPluginTraceLoad(pluginDetails, engine, id);
+    }
   }
 
   onTraceClose() {
-    for (const pluginDetails of this.plugins.values()) {
-      maybeDoPluginTraceUnload(pluginDetails);
+    for (const pluginDetails of this._plugins.values()) {
+      doPluginTraceUnload(pluginDetails);
     }
     this.engine = undefined;
   }
 
   metricVisualisations(): MetricVisualisation[] {
-    return Array.from(this.plugins.values()).flatMap((ctx) => {
+    return Array.from(this._plugins.values()).flatMap((ctx) => {
       const tracePlugin = ctx.plugin;
       if (tracePlugin.metricVisualisations) {
         return tracePlugin.metricVisualisations(ctx.context);
@@ -428,28 +527,35 @@
       }
     });
   }
-
-  private async doPluginTraceLoad(
-    pluginDetails: PluginDetails, engine: Engine,
-    pluginId: string): Promise<void> {
-    const {plugin, context} = pluginDetails;
-
-    const engineProxy = engine.getProxy(pluginId);
-
-    const traceCtx = new PluginContextTraceImpl(context, engineProxy);
-    pluginDetails.traceContext = traceCtx;
-
-    const result = plugin.onTraceLoad?.(traceCtx);
-    return Promise.resolve(result);
-  }
 }
 
-function maybeDoPluginTraceUnload(pluginDetails: PluginDetails): void {
+async function doPluginTraceLoad(
+  pluginDetails: PluginDetails,
+  engine: Engine,
+  pluginId: string): Promise<void> {
+  const {plugin, context} = pluginDetails;
+
+  const engineProxy = engine.getProxy(pluginId);
+
+  const traceCtx = new PluginContextTraceImpl(context, engineProxy);
+  pluginDetails.traceContext = traceCtx;
+
+  const startTime = performance.now();
+  const result = await Promise.resolve(plugin.onTraceLoad?.(traceCtx));
+  const loadTime = performance.now() - startTime;
+  pluginDetails.previousOnTraceLoadTimeMillis = loadTime;
+
+  raf.scheduleFullRedraw();
+
+  return result;
+}
+
+async function doPluginTraceUnload(
+  pluginDetails: PluginDetails): Promise<void> {
   const {traceContext, plugin} = pluginDetails;
 
   if (traceContext) {
-    // TODO(stevegolton): Await onTraceUnload.
-    plugin.onTraceUnload && plugin.onTraceUnload(traceContext);
+    plugin.onTraceUnload && await plugin.onTraceUnload(traceContext);
     traceContext.dispose();
     pluginDetails.traceContext = undefined;
   }
diff --git a/ui/src/common/plugins_unittest.ts b/ui/src/common/plugins_unittest.ts
index 05238a5..55fc82d 100644
--- a/ui/src/common/plugins_unittest.ts
+++ b/ui/src/common/plugins_unittest.ts
@@ -37,11 +37,8 @@
 const engine = new FakeEngine();
 globals.initStore(createEmptyState());
 
-// We use `any` here to avoid checking possibly undefined types in tests.
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-let mockPlugin: any;
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-let manager: any;
+let mockPlugin: Plugin;
+let manager: PluginManager;
 
 describe('PluginManger', () => {
   beforeEach(() => {
@@ -54,39 +51,39 @@
     manager = new PluginManager(registry);
   });
 
-  it('can activate plugin', () => {
-    manager.activatePlugin('foo');
+  it('can activate plugin', async () => {
+    await manager.activatePlugin('foo');
 
     expect(manager.isActive('foo')).toBe(true);
     expect(mockPlugin.onActivate).toHaveBeenCalledTimes(1);
   });
 
-  it('can deactivate plugin', () => {
-    manager.activatePlugin('foo');
-    manager.deactivatePlugin('foo');
+  it('can deactivate plugin', async () => {
+    await manager.activatePlugin('foo');
+    await manager.deactivatePlugin('foo');
 
     expect(manager.isActive('foo')).toBe(false);
     expect(mockPlugin.onDeactivate).toHaveBeenCalledTimes(1);
   });
 
-  it('invokes onTraceLoad when trace is loaded', () => {
-    manager.activatePlugin('foo');
-    manager.onTraceLoad(engine);
+  it('invokes onTraceLoad when trace is loaded', async () => {
+    await manager.activatePlugin('foo');
+    await manager.onTraceLoad(engine);
 
     expect(mockPlugin.onTraceLoad).toHaveBeenCalledTimes(1);
   });
 
-  it('invokes onTraceLoad when plugin activated while trace loaded', () => {
-    manager.onTraceLoad(engine);
-    manager.activatePlugin('foo');
+  it('invokes onTraceLoad when plugin activated while trace loaded', async () => {
+    await manager.onTraceLoad(engine);
+    await manager.activatePlugin('foo');
 
     expect(mockPlugin.onTraceLoad).toHaveBeenCalledTimes(1);
   });
 
-  it('invokes onTraceUnload when plugin deactivated while trace loaded', () => {
-    manager.activatePlugin('foo');
-    manager.onTraceLoad(engine);
-    manager.deactivatePlugin('foo');
+  it('invokes onTraceUnload when plugin deactivated while trace loaded', async () => {
+    await manager.activatePlugin('foo');
+    await manager.onTraceLoad(engine);
+    await manager.deactivatePlugin('foo');
 
     expect(mockPlugin.onTraceUnload).toHaveBeenCalledTimes(1);
   });
diff --git a/ui/src/common/state.ts b/ui/src/common/state.ts
index 777724b..379104a 100644
--- a/ui/src/common/state.ts
+++ b/ui/src/common/state.ts
@@ -131,8 +131,9 @@
 // 41. Ported all remaining tracks.
 // 42. Rename trackId -> trackKey.
 // 43. Remove visibleTracks.
-// 44. Add TabsV2 state
-export const STATE_VERSION = 44;
+// 44. Add TabsV2 state.
+// 45. Remove v1 tracks.
+export const STATE_VERSION = 45;
 
 export const SCROLLING_TRACK_GROUP = 'ScrollingTracks';
 
diff --git a/ui/src/common/tab_registry.ts b/ui/src/common/tab_registry.ts
index e9493de..038695d 100644
--- a/ui/src/common/tab_registry.ts
+++ b/ui/src/common/tab_registry.ts
@@ -26,6 +26,7 @@
  */
 export class TabManager implements Disposable {
   private _registry = new Map<string, TabDescriptor>();
+  private _defaultTabs = new Set<string>();
   private _detailsPanelsRegistry = new Set<DetailsPanel>();
   private _currentTabs = new Map<string, TabDescriptor>();
 
@@ -44,6 +45,13 @@
     });
   }
 
+  addDefaultTab(uri: string): Disposable {
+    this._defaultTabs.add(uri);
+    return new DisposableCallback(() => {
+      this._defaultTabs.delete(uri);
+    });
+  }
+
   registerDetailsPanel(section: DetailsPanel): Disposable {
     this._detailsPanelsRegistry.add(section);
     return new DisposableCallback(() => {
@@ -59,6 +67,10 @@
     return Array.from(this._registry.values());
   }
 
+  get defaultTabs(): string[] {
+    return Array.from(this._defaultTabs);
+  }
+
   get detailsPanels(): DetailsPanel[] {
     return Array.from(this._detailsPanelsRegistry);
   }
diff --git a/ui/src/controller/aggregation/slice_aggregation_controller.ts b/ui/src/controller/aggregation/slice_aggregation_controller.ts
index baf2057..6208594 100644
--- a/ui/src/controller/aggregation/slice_aggregation_controller.ts
+++ b/ui/src/controller/aggregation/slice_aggregation_controller.ts
@@ -16,9 +16,7 @@
 import {Area, Sorting} from '../../common/state';
 import {globals} from '../../frontend/globals';
 import {Engine} from '../../trace_processor/engine';
-import {
-  ASYNC_SLICE_TRACK_KIND,
-} from '../../tracks/async_slices/async_slice_track';
+import {ASYNC_SLICE_TRACK_KIND} from '../../tracks/async_slices';
 import {SLICE_TRACK_KIND} from '../../tracks/chrome_slices';
 
 import {AggregationController} from './aggregation_controller';
diff --git a/ui/src/controller/trace_controller.ts b/ui/src/controller/trace_controller.ts
index b5c6994..ad92b2f 100644
--- a/ui/src/controller/trace_controller.ts
+++ b/ui/src/controller/trace_controller.ts
@@ -523,6 +523,8 @@
       }
     }
 
+    this.decideTabs();
+
     await this.listThreads();
     await this.loadTimelineOverview(traceTime);
 
@@ -757,6 +759,13 @@
     globals.dispatchMultiple(actions);
   }
 
+  // Show the list of default tabs, but don't make them active!
+  private decideTabs() {
+    for (const tabUri of globals.tabManager.defaultTabs) {
+      globals.dispatch(Actions.showTab({uri: tabUri}));
+    }
+  }
+
   private async listThreads() {
     this.updateStatus('Reading thread list');
     const query = `select
diff --git a/ui/src/controller/track_decider.ts b/ui/src/controller/track_decider.ts
index 13ba2f1..c3f0cbe 100644
--- a/ui/src/controller/track_decider.ts
+++ b/ui/src/controller/track_decider.ts
@@ -27,8 +27,8 @@
   TrackSortKey,
   UtidToTrackSortKey,
 } from '../common/state';
-import {featureFlags, PERF_SAMPLE_FLAG} from '../core/feature_flags';
 import {globals} from '../frontend/globals';
+import {PERF_SAMPLE_FLAG} from '../core/feature_flags';
 import {PrimaryTrackSortKey} from '../public';
 import {getTrackName} from '../public/utils';
 import {Engine, EngineProxy} from '../trace_processor/engine';
@@ -38,7 +38,7 @@
   STR,
   STR_NULL,
 } from '../trace_processor/query_result';
-import {ASYNC_SLICE_TRACK_KIND} from '../tracks/async_slices/async_slice_track';
+import {ASYNC_SLICE_TRACK_KIND} from '../tracks/async_slices';
 import {
   ENABLE_SCROLL_JANK_PLUGIN_V2,
   getScrollJankTracks,
@@ -58,29 +58,6 @@
 } from '../tracks/screenshots';
 import {THREAD_STATE_TRACK_KIND} from '../tracks/thread_state';
 
-const TRACKS_V2_FLAG = featureFlags.register({
-  id: 'tracksV2.2',
-  name: 'Tracks V2',
-  description: '[WARNING SOON TO BE REMOVED] Show tracks built on top of the Track V2 API.',
-  defaultValue: true,
-});
-
-const TRACKS_V2_COMPARE_FLAG = featureFlags.register({
-  id: 'tracksV2Compare',
-  name: 'Tracks V2: Also show V1 tracks',
-  description:
-      'Show V1 tracks side by side with V2 tracks. Does nothing if TracksV2 is not enabled.',
-  defaultValue: false,
-});
-
-function showV2(): boolean {
-  return TRACKS_V2_FLAG.get();
-}
-
-function showV1(): boolean {
-  return !showV2() || (showV2() && TRACKS_V2_COMPARE_FLAG.get());
-}
-
 const MEM_DMA_COUNTER_NAME = 'mem.dma_heap';
 const MEM_DMA = 'mem.dma_buffer';
 const MEM_ION = 'mem.ion';
@@ -290,25 +267,14 @@
         }
       }
 
-      if (showV1()) {
-        const track: AddTrackArgs = {
-          uri: `perfetto.AsyncSlices#${rawName}.${it.parentId}`,
-          trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
-          trackGroup,
-          name,
-        };
-        this.tracksToAdd.push(track);
-      }
+      const track: AddTrackArgs = {
+        uri: `perfetto.AsyncSlices#${rawName}.${it.parentId}`,
+        trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
+        trackGroup,
+        name,
+      };
 
-      if (showV2()) {
-        const track: AddTrackArgs = {
-          uri: `perfetto.AsyncSlices#${rawName}.${it.parentId}.v2`,
-          trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
-          trackGroup,
-          name,
-        };
-        this.tracksToAdd.push(track);
-      }
+      this.tracksToAdd.push(track);
     }
   }
 
@@ -837,29 +803,15 @@
       const name =
           getTrackName({utid, tid, threadName, kind: THREAD_STATE_TRACK_KIND});
 
-      if (showV1()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.ThreadState#${upid}.${utid}`,
-          name,
-          trackGroup: uuid,
-          trackSortKey: {
-            utid,
-            priority,
-          },
-        });
-      }
-
-      if (showV2()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.ThreadState#${utid}.v2`,
-          name,
-          trackGroup: uuid,
-          trackSortKey: {
-            utid,
-            priority,
-          },
-        });
-      }
+      this.tracksToAdd.push({
+        uri: `perfetto.ThreadState#${utid}`,
+        name,
+        trackGroup: uuid,
+        trackSortKey: {
+          utid,
+          priority,
+        },
+      });
     }
   }
 
@@ -1008,23 +960,12 @@
         kind: ASYNC_SLICE_TRACK_KIND,
       });
 
-      if (showV1()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.AsyncSlices#process.${pid}${rawTrackIds}`,
-          name,
-          trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
-          trackGroup: uuid,
-        });
-      }
-
-      if (showV2()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.AsyncSlices#process.${pid}${rawTrackIds}.v2`,
-          name,
-          trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
-          trackGroup: uuid,
-        });
-      }
+      this.tracksToAdd.push({
+        uri: `perfetto.AsyncSlices#process.${pid}${rawTrackIds}`,
+        name,
+        trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
+        trackGroup: uuid,
+      });
     }
   }
 
@@ -1089,23 +1030,12 @@
         groupMap.set(rawName, [groupUuid, summaryTrackKey]);
       }
 
-      if (showV1()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.AsyncSlices#${rawName}.${uid}`,
-          name: userName,
-          trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
-          trackGroup: groupUuid,
-        });
-      }
-
-      if (showV2()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.AsyncSlices#${rawName}.${uid}.v2`,
-          name: userName,
-          trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
-          trackGroup: groupUuid,
-        });
-      }
+      this.tracksToAdd.push({
+        uri: `perfetto.AsyncSlices#${rawName}.${uid}`,
+        name: userName,
+        trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
+        trackGroup: groupUuid,
+      });
     }
 
     for (const [name, [groupUuid, summaryTrackKey]] of groupMap) {
@@ -1167,23 +1097,12 @@
       const name =
           getTrackName({name: trackName, upid, pid, processName, kind});
 
-      if (showV1()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.ActualFrames#${upid}`,
-          name,
-          trackSortKey: PrimaryTrackSortKey.ACTUAL_FRAMES_SLICE_TRACK,
-          trackGroup: uuid,
-        });
-      }
-
-      if (showV2()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.ActualFrames#${upid}.v2`,
-          name,
-          trackSortKey: PrimaryTrackSortKey.ACTUAL_FRAMES_SLICE_TRACK,
-          trackGroup: uuid,
-        });
-      }
+      this.tracksToAdd.push({
+        uri: `perfetto.ActualFrames#${upid}`,
+        name,
+        trackSortKey: PrimaryTrackSortKey.ACTUAL_FRAMES_SLICE_TRACK,
+        trackGroup: uuid,
+      });
     }
   }
 
@@ -1236,23 +1155,12 @@
       const name =
           getTrackName({name: trackName, upid, pid, processName, kind});
 
-      if (showV1()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.ExpectedFrames#${upid}`,
-          name,
-          trackSortKey: PrimaryTrackSortKey.EXPECTED_FRAMES_SLICE_TRACK,
-          trackGroup: uuid,
-        });
-      }
-
-      if (showV2()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.ExpectedFrames#${upid}.v2`,
-          name,
-          trackSortKey: PrimaryTrackSortKey.EXPECTED_FRAMES_SLICE_TRACK,
-          trackGroup: uuid,
-        });
-      }
+      this.tracksToAdd.push({
+        uri: `perfetto.ExpectedFrames#${upid}`,
+        name,
+        trackSortKey: PrimaryTrackSortKey.EXPECTED_FRAMES_SLICE_TRACK,
+        trackGroup: uuid,
+      });
     }
   }
 
@@ -1298,33 +1206,18 @@
 
       const kind = SLICE_TRACK_KIND;
       const name = getTrackName({name: trackName, utid, tid, threadName, kind});
-      if (showV1()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.ChromeSlices#${trackId}`,
-          name,
-          trackGroup: uuid,
-          trackSortKey: {
-            utid,
-            priority: isDefaultTrackForScope ?
-              InThreadTrackSortKey.DEFAULT_TRACK :
-              InThreadTrackSortKey.ORDINARY,
-          },
-        });
-      }
 
-      if (showV2()) {
-        this.tracksToAdd.push({
-          uri: `perfetto.ChromeSlices#${trackId}.v2`,
-          name,
-          trackGroup: uuid,
-          trackSortKey: {
-            utid,
-            priority: isDefaultTrackForScope ?
-              InThreadTrackSortKey.DEFAULT_TRACK :
-              InThreadTrackSortKey.ORDINARY,
-          },
-        });
-      }
+      this.tracksToAdd.push({
+        uri: `perfetto.ChromeSlices#${trackId}`,
+        name,
+        trackGroup: uuid,
+        trackSortKey: {
+          utid,
+          priority: isDefaultTrackForScope ?
+            InThreadTrackSortKey.DEFAULT_TRACK :
+            InThreadTrackSortKey.ORDINARY,
+        },
+      });
     }
   }
 
diff --git a/ui/src/core/feature_flags.ts b/ui/src/core/feature_flags.ts
index f00d535..5fec7bb 100644
--- a/ui/src/core/feature_flags.ts
+++ b/ui/src/core/feature_flags.ts
@@ -249,5 +249,5 @@
   id: 'tabsv2',
   name: 'Tabs V2',
   description: 'Use Tabs V2',
-  defaultValue: false,
+  defaultValue: true,
 });
diff --git a/ui/src/frontend/aggregation_tab.ts b/ui/src/frontend/aggregation_tab.ts
index 0db524e..603599d 100644
--- a/ui/src/frontend/aggregation_tab.ts
+++ b/ui/src/frontend/aggregation_tab.ts
@@ -26,6 +26,7 @@
 import {Icons} from '../base/semantic_icons';
 import {Tree, TreeNode} from '../widgets/tree';
 import {Timestamp} from './widgets/timestamp';
+import {PIVOT_TABLE_REDUX_FLAG} from '../controller/pivot_table_controller';
 
 interface AreaDetailsPanelAttrs {
   selection: AreaSelection;
@@ -96,6 +97,21 @@
         'Flow Events'),
     }));
 
+    if (PIVOT_TABLE_REDUX_FLAG.get()) {
+      linkNodes.push(m(TreeNode, {
+        left: m(
+          Anchor,
+          {
+            icon: Icons.ChangeTab,
+            onclick: () => {
+              globals.dispatch(
+                Actions.showTab({uri: 'perfetto.PivotTable#PivotTable'}));
+            },
+          },
+          'Pivot Table'),
+      }));
+    }
+
     if (linkNodes.length === 0) return undefined;
 
     return m(Section,
@@ -148,7 +164,12 @@
         uri,
         isEphemeral: false,
         content: {
-          getTitle: () => `Aggregation: ${title}`,
+          hasContent: () => {
+            const data = globals.aggregateDataStore.get(type);
+            const hasData = Boolean(data && !isEmptyData(data));
+            return hasData;
+          },
+          getTitle: () => title,
           render: () => {
             const data = globals.aggregateDataStore.get(type);
             return m(AggregationPanel, {kind: type, data});
diff --git a/ui/src/frontend/drag_handle.ts b/ui/src/frontend/drag_handle.ts
index e3da5ce..4ba4220 100644
--- a/ui/src/frontend/drag_handle.ts
+++ b/ui/src/frontend/drag_handle.ts
@@ -31,7 +31,7 @@
   key: string;
 
   // Tab title to show on the tab handle.
-  title: string;
+  title: m.Children;
 
   // Whether to show a close button on the tab handle or not.
   // Default = false.
diff --git a/ui/src/frontend/index.ts b/ui/src/frontend/index.ts
index c9d0ab8..623017c 100644
--- a/ui/src/frontend/index.ts
+++ b/ui/src/frontend/index.ts
@@ -23,7 +23,7 @@
 import {addErrorHandler, reportError} from '../base/logging';
 import {Actions, DeferredAction, StateActions} from '../common/actions';
 import {flattenArgs, traceEvent} from '../common/metatracing';
-import {pluginManager, pluginRegistry} from '../common/plugins';
+import {pluginManager} from '../common/plugins';
 import {State} from '../common/state';
 import {initController, runControllers} from '../controller';
 import {
@@ -321,20 +321,7 @@
     document.body.classList.add('testing');
   }
 
-  for (const plugin of pluginRegistry.values()) {
-    const id = `plugin_${plugin.pluginId}`;
-    const name = `Plugin: ${plugin.pluginId}`;
-    const flag = featureFlags.register({
-      id,
-      name,
-      description: `Overrides '${id}' plugin.`,
-      defaultValue: true,
-    });
-
-    if (flag.get()) {
-      pluginManager.activatePlugin(plugin.pluginId);
-    }
-  }
+  pluginManager.initialize();
 }
 
 function onCssLoaded() {
diff --git a/ui/src/frontend/plugins_page.ts b/ui/src/frontend/plugins_page.ts
index c75a4a6..dd84526 100644
--- a/ui/src/frontend/plugins_page.ts
+++ b/ui/src/frontend/plugins_page.ts
@@ -16,10 +16,12 @@
 
 import {pluginManager, pluginRegistry} from '../common/plugins';
 import {raf} from '../core/raf_scheduler';
-import {PluginDescriptor} from '../public';
 import {Button} from '../widgets/button';
 
+import {exists} from '../base/utils';
+import {PluginDescriptor} from '../public';
 import {createPage} from './pages';
+import {defaultPlugins} from '../common/default_plugins';
 
 export const PluginsPage = createPage({
   view() {
@@ -30,27 +32,43 @@
         '.pf-plugins-topbar',
         m(Button, {
           minimal: false,
-          label: 'Deactivate All',
-          onclick: () => {
+          label: 'Disable All',
+          onclick: async () => {
             for (const plugin of pluginRegistry.values()) {
-              pluginManager.deactivatePlugin(plugin.pluginId);
+              await pluginManager.disablePlugin(plugin.pluginId, true);
+              raf.scheduleFullRedraw();
             }
-            raf.scheduleFullRedraw();
           },
         }),
         m(Button, {
           minimal: false,
-          label: 'Activate All',
-          onclick: () => {
+          label: 'Enable All',
+          onclick: async () => {
             for (const plugin of pluginRegistry.values()) {
-              pluginManager.activatePlugin(plugin.pluginId);
+              await pluginManager.enablePlugin(plugin.pluginId, true);
+              raf.scheduleFullRedraw();
             }
+          },
+        }),
+        m(Button, {
+          minimal: false,
+          label: 'Restore Defaults',
+          onclick: async () => {
+            await pluginManager.restoreDefaults(true);
             raf.scheduleFullRedraw();
           },
         }),
       ),
       m(
         '.pf-plugins-grid',
+        [
+          m('span', 'Plugin'),
+          m('span', 'Default?'),
+          m('span', 'Enabled?'),
+          m('span', 'Active?'),
+          m('span', 'Control'),
+          m('span', 'Load Time'),
+        ],
         Array.from(pluginRegistry.values()).map((plugin) => {
           return renderPluginRow(plugin);
         }),
@@ -59,21 +77,32 @@
 });
 
 function renderPluginRow(plugin: PluginDescriptor): m.Children {
-  const isActive = pluginManager.isActive(plugin.pluginId);
+  const pluginId = plugin.pluginId;
+  const isDefault = defaultPlugins.includes(pluginId);
+  const pluginDetails = pluginManager.plugins.get(pluginId);
+  const isActive = pluginManager.isActive(pluginId);
+  const isEnabled = pluginManager.isEnabled(pluginId);
+  const loadTime = pluginDetails?.previousOnTraceLoadTimeMillis;
   return [
-    plugin.pluginId,
+    m('span', pluginId),
+    m('span', isDefault ? 'Yes' : 'No'),
+    isEnabled ? m('.pf-tag.pf-active', 'Enabled') :
+      m('.pf-tag.pf-inactive', 'Disabled'),
     isActive ? m('.pf-tag.pf-active', 'Active') :
       m('.pf-tag.pf-inactive', 'Inactive'),
     m(Button, {
-      label: isActive ? 'Deactivate' : 'Activate',
-      onclick: () => {
+      label: isActive ? 'Disable' : 'Enable',
+      onclick: async () => {
         if (isActive) {
-          pluginManager.deactivatePlugin(plugin.pluginId);
+          await pluginManager.disablePlugin(pluginId, true);
         } else {
-          pluginManager.activatePlugin(plugin.pluginId);
+          await pluginManager.enablePlugin(pluginId, true);
         }
         raf.scheduleFullRedraw();
       },
     }),
+    exists(loadTime) ?
+      m('span', `${loadTime.toFixed(1)} ms`) :
+      m('span', `-`),
   ];
 }
diff --git a/ui/src/frontend/tab_panel.ts b/ui/src/frontend/tab_panel.ts
index 73cfa16..130a494 100644
--- a/ui/src/frontend/tab_panel.ts
+++ b/ui/src/frontend/tab_panel.ts
@@ -44,10 +44,13 @@
     const resolvedTabs = tabMan.resolveTabs(tabList);
     const tabs = resolvedTabs.map(({uri, tab: tabDesc}): TabWithContent => {
       if (tabDesc) {
+        const titleStr = tabDesc.content.getTitle();
         return {
           key: uri,
           hasCloseButton: true,
-          title: tabDesc.content.getTitle(),
+          title: (tabDesc.content.hasContent?.() ?? true) ?
+            titleStr :
+            m('.pf-nocontent', titleStr),
           content: tabDesc.content.render(),
         };
       } else {
diff --git a/ui/src/frontend/track_panel.ts b/ui/src/frontend/track_panel.ts
index dad4861..da06f31 100644
--- a/ui/src/frontend/track_panel.ts
+++ b/ui/src/frontend/track_panel.ts
@@ -323,7 +323,10 @@
     // TODO(hjd): The min height below must match the track_shell_title
     // max height in common.scss so we should read it from CSS to avoid
     // them going out of sync.
-    const height = Math.max(24, attrs.heightPx ?? 0);
+    const TRACK_HEIGHT_MIN_PX = 18;
+    const TRACK_HEIGHT_DEFAULT_PX = 24;
+    const trackHeightRaw = attrs.heightPx ?? TRACK_HEIGHT_DEFAULT_PX;
+    const trackHeight = Math.max(trackHeightRaw, TRACK_HEIGHT_MIN_PX);
 
     return m(
       '.track',
@@ -331,7 +334,7 @@
         style: {
           // Note: Sub-pixel track heights can mess with sticky elements.
           // Round up to the nearest integer number of pixels.
-          height: `${Math.ceil(height)}px`,
+          height: `${Math.ceil(trackHeight)}px`,
         },
         id: 'track_' + attrs.trackKey,
       },
diff --git a/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts b/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts
index fa9624a..d3216df 100644
--- a/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts
+++ b/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts
@@ -259,7 +259,7 @@
 
 const SCREEN_STATE = `
   WITH _counter AS (
-    SELECT *
+    SELECT counter.id, ts, 0 AS track_id, value
     FROM counter
     JOIN counter_track ON counter_track.id = counter.track_id
     WHERE name = 'ScreenState'
@@ -279,7 +279,7 @@
 // they transition.
 const DOZE_LIGHT = `
   WITH _counter AS (
-    SELECT *
+    SELECT counter.id, ts, 0 AS track_id, value
     FROM counter
     JOIN counter_track ON counter_track.id = counter.track_id
     WHERE name = 'DozeLightState'
@@ -300,7 +300,7 @@
 
 const DOZE_DEEP = `
   WITH _counter AS (
-    SELECT *
+    SELECT counter.id, ts, 0 AS track_id, value
     FROM counter
     JOIN counter_track ON counter_track.id = counter.track_id
     WHERE name = 'DozeDeepState'
@@ -323,7 +323,7 @@
 
 const CHARGING = `
   WITH _counter AS (
-    SELECT *
+    SELECT counter.id, ts, 0 AS track_id, value
     FROM counter
     JOIN counter_track ON counter_track.id = counter.track_id
     WHERE name = 'BatteryStatus'
diff --git a/ui/src/plugins/dev.perfetto.BookmarkletApi/OWNERS b/ui/src/plugins/dev.perfetto.BookmarkletApi/OWNERS
new file mode 100644
index 0000000..888f192
--- /dev/null
+++ b/ui/src/plugins/dev.perfetto.BookmarkletApi/OWNERS
@@ -0,0 +1,2 @@
+hjd@google.com
+stevegolton@google.com
diff --git a/ui/src/plugins/dev.perfetto.BookmarkletApi/index.ts b/ui/src/plugins/dev.perfetto.BookmarkletApi/index.ts
new file mode 100644
index 0000000..767e29d
--- /dev/null
+++ b/ui/src/plugins/dev.perfetto.BookmarkletApi/index.ts
@@ -0,0 +1,52 @@
+// Copyright (C) 2024 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.
+
+import {
+  Plugin,
+  PluginContext,
+  PluginContextTrace,
+  PluginDescriptor,
+} from '../../public';
+
+declare global {
+  interface Window {
+    ctx: PluginContext | PluginContextTrace | undefined;
+  }
+}
+
+class BookmarkletApi implements Plugin {
+  private pluginCtx?: PluginContext;
+
+  onActivate(pluginCtx: PluginContext): void {
+    this.pluginCtx = pluginCtx;
+    window.ctx = pluginCtx;
+  }
+
+  async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
+    window.ctx = ctx;
+  }
+
+  async onTraceUnload(_: PluginContextTrace): Promise<void> {
+    window.ctx = this.pluginCtx;
+  }
+
+  onDeactivate(_: PluginContext): void {
+    window.ctx = undefined;
+  }
+}
+
+export const plugin: PluginDescriptor = {
+  pluginId: 'dev.perfetto.BookmarkletApi',
+  plugin: BookmarkletApi,
+};
diff --git a/ui/src/public/index.ts b/ui/src/public/index.ts
index 174e49b..7d9e1bd 100644
--- a/ui/src/public/index.ts
+++ b/ui/src/public/index.ts
@@ -312,6 +312,7 @@
 }
 
 export interface Tab {
+  hasContent?(): boolean;
   render(): m.Children;
   getTitle(): string;
 }
@@ -406,6 +407,9 @@
   // is deactivated or when the trace is unloaded.
   registerTab(tab: TabDescriptor): void;
 
+  // Suggest that a tab should be shown immediately.
+  addDefaultTab(uri: string): void;
+
   // Register a hook into the current selection tab rendering logic that allows
   // customization of the current selection tab content.
   registerDetailsPanel(sel: DetailsPanel): void;
diff --git a/ui/src/tracks/android_log/index.ts b/ui/src/tracks/android_log/index.ts
index 212d1cc..cdef7ff 100644
--- a/ui/src/tracks/android_log/index.ts
+++ b/ui/src/tracks/android_log/index.ts
@@ -152,8 +152,8 @@
   async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
     const result =
         await ctx.engine.query(`select count(1) as cnt from android_logs`);
-    const count = result.firstRow({cnt: NUM}).cnt;
-    if (count > 0) {
+    const logCount = result.firstRow({cnt: NUM}).cnt;
+    if (logCount > 0) {
       ctx.registerTrack({
         uri: 'perfetto.AndroidLog',
         displayName: 'Android logs',
@@ -174,6 +174,10 @@
       },
     });
 
+    if (logCount > 0) {
+      ctx.addDefaultTab(androidLogsTabUri);
+    }
+
     ctx.registerCommand({
       id: 'perfetto.AndroidLog#ShowLogsTab',
       name: 'Show Android Logs Tab',
diff --git a/ui/src/tracks/async_slices/async_slice_track.ts b/ui/src/tracks/async_slices/async_slice_track.ts
deleted file mode 100644
index b5d33e7..0000000
--- a/ui/src/tracks/async_slices/async_slice_track.ts
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (C) 2021 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.
-
-import {BigintMath as BIMath} from '../../base/bigint_math';
-import {duration, time} from '../../base/time';
-import {SliceData, SliceTrackLEGACY} from '../../frontend/slice_track';
-import {EngineProxy} from '../../public';
-import {
-  LONG,
-  LONG_NULL,
-  NUM,
-  STR,
-} from '../../trace_processor/query_result';
-
-export const ASYNC_SLICE_TRACK_KIND = 'AsyncSliceTrack';
-
-export class AsyncSliceTrack extends SliceTrackLEGACY {
-  private maxDurNs: duration = 0n;
-
-  constructor(
-      private engine: EngineProxy, maxDepth: number, trackKey: string,
-      private trackIds: number[], namespace?: string) {
-    // TODO is 'slice' right here?
-    super(maxDepth, trackKey, 'slice', namespace);
-  }
-
-  async onBoundsChange(start: time, end: time, resolution: duration):
-      Promise<SliceData> {
-    if (this.maxDurNs === 0n) {
-      const maxDurResult = await this.engine.query(`
-        select max(iif(dur = -1, (SELECT end_ts FROM trace_bounds) - ts,
-        dur)) as maxDur from experimental_slice_layout where filter_track_ids
-        = '${this.trackIds.join(',')}'
-      `);
-      this.maxDurNs = maxDurResult.firstRow({maxDur: LONG_NULL}).maxDur ?? 0n;
-    }
-
-    const queryRes = await this.engine.query(`
-      SELECT
-      (ts + ${resolution / 2n}) / ${resolution} * ${resolution} as tsq,
-        ts,
-        max(iif(dur = -1, (SELECT end_ts FROM trace_bounds) - ts, dur)) as
-        dur, layout_depth as depth, ifnull(name, '[null]') as name, id, dur =
-        0 as isInstant, dur = -1 as isIncomplete
-      from experimental_slice_layout
-      where
-        filter_track_ids = '${this.trackIds.join(',')}' and
-        ts >= ${start - this.maxDurNs} and
-        ts <= ${end}
-      group by tsq, layout_depth
-      order by tsq, layout_depth
-    `);
-
-    const numRows = queryRes.numRows();
-    const slices: SliceData = {
-      start,
-      end,
-      resolution,
-      length: numRows,
-      strings: [],
-      sliceIds: new Float64Array(numRows),
-      starts: new BigInt64Array(numRows),
-      ends: new BigInt64Array(numRows),
-      depths: new Uint16Array(numRows),
-      titles: new Uint16Array(numRows),
-      isInstant: new Uint16Array(numRows),
-      isIncomplete: new Uint16Array(numRows),
-    };
-
-    const stringIndexes = new Map<string, number>();
-    function internString(str: string) {
-      let idx = stringIndexes.get(str);
-      if (idx !== undefined) return idx;
-      idx = slices.strings.length;
-      slices.strings.push(str);
-      stringIndexes.set(str, idx);
-      return idx;
-    }
-
-    const it = queryRes.iter({
-      tsq: LONG,
-      ts: LONG,
-      dur: LONG,
-      depth: NUM,
-      name: STR,
-      id: NUM,
-      isInstant: NUM,
-      isIncomplete: NUM,
-    });
-    for (let row = 0; it.valid(); it.next(), row++) {
-      const startQ = it.tsq;
-      const start = it.ts;
-      const dur = it.dur;
-      const end = start + dur;
-      const minEnd = startQ + resolution;
-      const endQ = BIMath.max(BIMath.quant(end, resolution), minEnd);
-
-      slices.starts[row] = startQ;
-      slices.ends[row] = endQ;
-      slices.depths[row] = it.depth;
-      slices.titles[row] = internString(it.name);
-      slices.sliceIds[row] = it.id;
-      slices.isInstant[row] = it.isInstant;
-      slices.isIncomplete[row] = it.isIncomplete;
-    }
-    return slices;
-  }
-}
diff --git a/ui/src/tracks/async_slices/index.ts b/ui/src/tracks/async_slices/index.ts
index 2a94887..40b018b 100644
--- a/ui/src/tracks/async_slices/index.ts
+++ b/ui/src/tracks/async_slices/index.ts
@@ -26,7 +26,6 @@
   STR_NULL,
 } from '../../trace_processor/query_result';
 
-import {AsyncSliceTrack} from './async_slice_track';
 import {AsyncSliceTrackV2} from './async_slice_track_v2';
 
 export const ASYNC_SLICE_TRACK_KIND = 'AsyncSliceTrack';
@@ -118,21 +117,6 @@
         trackIds,
         kind: ASYNC_SLICE_TRACK_KIND,
         trackFactory: ({trackKey}) => {
-          return new AsyncSliceTrack(
-            engine,
-            maxDepth,
-            trackKey,
-            trackIds,
-          );
-        },
-      });
-
-      ctx.registerTrack({
-        uri: `perfetto.AsyncSlices#${rawName}.${it.parentId}.v2`,
-        displayName,
-        trackIds,
-        kind: ASYNC_SLICE_TRACK_KIND,
-        trackFactory: ({trackKey}) => {
           return new AsyncSliceTrackV2(
             {engine, trackKey},
             maxDepth,
@@ -200,21 +184,6 @@
         trackIds,
         kind: ASYNC_SLICE_TRACK_KIND,
         trackFactory: ({trackKey}) => {
-          return new AsyncSliceTrack(
-            ctx.engine,
-            maxDepth,
-            trackKey,
-            trackIds,
-          );
-        },
-      });
-
-      ctx.registerTrack({
-        uri: `perfetto.AsyncSlices#process.${pid}${rawTrackIds}.v2`,
-        displayName,
-        trackIds,
-        kind: ASYNC_SLICE_TRACK_KIND,
-        trackFactory: ({trackKey}) => {
           return new AsyncSliceTrackV2(
             {engine: ctx.engine, trackKey},
             maxDepth,
@@ -291,21 +260,6 @@
         trackIds,
         kind: ASYNC_SLICE_TRACK_KIND,
         trackFactory: ({trackKey}) => {
-          return new AsyncSliceTrack(
-            engine,
-            maxDepth,
-            trackKey,
-            trackIds,
-          );
-        },
-      });
-
-      ctx.registerTrack({
-        uri: `perfetto.AsyncSlices#${rawName}.${uid}.v2`,
-        displayName,
-        trackIds,
-        kind: ASYNC_SLICE_TRACK_KIND,
-        trackFactory: ({trackKey}) => {
           return new AsyncSliceTrackV2(
             {engine, trackKey},
             maxDepth,
diff --git a/ui/src/tracks/chrome_scroll_jank/index.ts b/ui/src/tracks/chrome_scroll_jank/index.ts
index 3f603a5..bc92259 100644
--- a/ui/src/tracks/chrome_scroll_jank/index.ts
+++ b/ui/src/tracks/chrome_scroll_jank/index.ts
@@ -181,7 +181,8 @@
     // Initialise the chrome_tasks_delaying_input_processing table. It will be
     // used in the tracks above.
     await ctx.engine.query(`
-      select RUN_METRIC(
+      INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
+      SELECT RUN_METRIC(
         'chrome/chrome_tasks_delaying_input_processing.sql',
         'duration_causing_jank_ms',
         /* duration_causing_jank_ms = */ '8');`);
diff --git a/ui/src/tracks/chrome_slices/index.ts b/ui/src/tracks/chrome_slices/index.ts
index 06109fc..72b7f8a 100644
--- a/ui/src/tracks/chrome_slices/index.ts
+++ b/ui/src/tracks/chrome_slices/index.ts
@@ -270,23 +270,6 @@
         trackIds: [trackId],
         kind: SLICE_TRACK_KIND,
         trackFactory: ({trackKey}) => {
-          return new ChromeSliceTrack(
-            engine,
-            maxDepth,
-            trackKey,
-            trackId,
-          );
-        },
-      });
-
-      // trackIds can only be registered by one track at a time.
-      // TODO(hjd): Move trackIds to only be on V2.
-      ctx.registerTrack({
-        uri: `perfetto.ChromeSlices#${trackId}.v2`,
-        displayName,
-        trackIds: [trackId],
-        kind: SLICE_TRACK_KIND,
-        trackFactory: ({trackKey}) => {
           const newTrackArgs = {
             engine: ctx.engine,
             trackKey,
diff --git a/ui/src/tracks/frames/actual_frames_track.ts b/ui/src/tracks/frames/actual_frames_track.ts
deleted file mode 100644
index 79e742d..0000000
--- a/ui/src/tracks/frames/actual_frames_track.ts
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (C) 2023 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.
-
-import {BigintMath as BIMath} from '../../base/bigint_math';
-import {duration, time} from '../../base/time';
-import {SliceData, SliceTrackLEGACY} from '../../frontend/slice_track';
-import {
-  EngineProxy,
-} from '../../public';
-import {
-  LONG,
-  LONG_NULL,
-  NUM,
-  STR,
-} from '../../trace_processor/query_result';
-
-export const ACTUAL_FRAMES_SLICE_TRACK_KIND = 'ActualFramesSliceTrack';
-
-const BLUE_COLOR = '#03A9F4';         // Blue 500
-const GREEN_COLOR = '#4CAF50';        // Green 500
-const YELLOW_COLOR = '#FFEB3B';       // Yellow 500
-const RED_COLOR = '#FF5722';          // Red 500
-const LIGHT_GREEN_COLOR = '#C0D588';  // Light Green 500
-const PINK_COLOR = '#F515E0';         // Pink 500
-
-export class ActualFramesTrack extends SliceTrackLEGACY {
-  private maxDur = 0n;
-
-  constructor(
-      private engine: EngineProxy, maxDepth: number, trackKey: string,
-      private trackIds: number[], namespace?: string) {
-    super(maxDepth, trackKey, 'actual_frame_timeline_slice', namespace);
-  }
-
-  async onBoundsChange(start: time, end: time, resolution: duration):
-      Promise<SliceData> {
-    if (this.maxDur === 0n) {
-      const maxDurResult = await this.engine.query(`
-    select
-      max(iif(dur = -1, (SELECT end_ts FROM trace_bounds) - ts, dur))
-        as maxDur
-    from experimental_slice_layout
-    where filter_track_ids = '${this.trackIds.join(',')}'
-  `);
-      this.maxDur = maxDurResult.firstRow({maxDur: LONG_NULL}).maxDur ?? 0n;
-    }
-
-    const rawResult = await this.engine.query(`
-  SELECT
-    (s.ts + ${resolution / 2n}) / ${resolution} * ${resolution} as tsq,
-    s.ts as ts,
-    max(iif(s.dur = -1, (SELECT end_ts FROM trace_bounds) - s.ts, s.dur))
-        as dur,
-    s.layout_depth as layoutDepth,
-    s.name as name,
-    s.id as id,
-    s.dur = 0 as isInstant,
-    s.dur = -1 as isIncomplete,
-    CASE afs.jank_tag
-      WHEN 'Self Jank' THEN '${RED_COLOR}'
-      WHEN 'Other Jank' THEN '${YELLOW_COLOR}'
-      WHEN 'Dropped Frame' THEN '${BLUE_COLOR}'
-      WHEN 'Buffer Stuffing' THEN '${LIGHT_GREEN_COLOR}'
-      WHEN 'SurfaceFlinger Stuffing' THEN '${LIGHT_GREEN_COLOR}'
-      WHEN 'No Jank' THEN '${GREEN_COLOR}'
-      ELSE '${PINK_COLOR}'
-    END as color
-  from experimental_slice_layout s
-  join actual_frame_timeline_slice afs using(id)
-  where
-    filter_track_ids = '${this.trackIds.join(',')}' and
-    s.ts >= ${start - this.maxDur} and
-    s.ts <= ${end}
-  group by tsq, s.layout_depth
-  order by tsq, s.layout_depth
-`);
-
-    const numRows = rawResult.numRows();
-    const slices: SliceData = {
-      start,
-      end,
-      resolution,
-      length: numRows,
-      strings: [],
-      sliceIds: new Float64Array(numRows),
-      starts: new BigInt64Array(numRows),
-      ends: new BigInt64Array(numRows),
-      depths: new Uint16Array(numRows),
-      titles: new Uint16Array(numRows),
-      colors: new Uint16Array(numRows),
-      isInstant: new Uint16Array(numRows),
-      isIncomplete: new Uint16Array(numRows),
-    };
-
-    const stringIndexes = new Map<string, number>();
-    function internString(str: string) {
-      let idx = stringIndexes.get(str);
-      if (idx !== undefined) return idx;
-      idx = slices.strings.length;
-      slices.strings.push(str);
-      stringIndexes.set(str, idx);
-      return idx;
-    }
-
-    const it = rawResult.iter({
-      'tsq': LONG,
-      'ts': LONG,
-      'dur': LONG,
-      'layoutDepth': NUM,
-      'id': NUM,
-      'name': STR,
-      'isInstant': NUM,
-      'isIncomplete': NUM,
-      'color': STR,
-    });
-    for (let i = 0; it.valid(); i++, it.next()) {
-      const startQ = it.tsq;
-      const start = it.ts;
-      const dur = it.dur;
-      const end = start + dur;
-      const minEnd = startQ + resolution;
-      const endQ = BIMath.max(BIMath.quant(end, resolution), minEnd);
-
-      slices.starts[i] = startQ;
-      slices.ends[i] = endQ;
-      slices.depths[i] = it.layoutDepth;
-      slices.titles[i] = internString(it.name);
-      slices.colors![i] = internString(it.color);
-      slices.sliceIds[i] = it.id;
-      slices.isInstant[i] = it.isInstant;
-      slices.isIncomplete[i] = it.isIncomplete;
-    }
-    return slices;
-  }
-}
diff --git a/ui/src/tracks/frames/expected_frames_track.ts b/ui/src/tracks/frames/expected_frames_track.ts
deleted file mode 100644
index 4e98b67..0000000
--- a/ui/src/tracks/frames/expected_frames_track.ts
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright (C) 2021 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.
-
-import {BigintMath as BIMath} from '../../base/bigint_math';
-import {Duration, duration, time} from '../../base/time';
-import {SliceData, SliceTrackLEGACY} from '../../frontend/slice_track';
-import {EngineProxy} from '../../public';
-import {
-  LONG,
-  LONG_NULL,
-  NUM,
-  STR,
-} from '../../trace_processor/query_result';
-
-export class ExpectedFramesTrack extends SliceTrackLEGACY {
-  private maxDur = Duration.ZERO;
-
-  constructor(
-      private engine: EngineProxy, maxDepth: number, trackKey: string,
-      private trackIds: number[], namespace?: string) {
-    super(maxDepth, trackKey, '', namespace);
-  }
-
-  async onBoundsChange(start: time, end: time, resolution: duration):
-      Promise<SliceData> {
-    if (this.maxDur === Duration.ZERO) {
-      const maxDurResult = await this.engine.query(`
-        select max(iif(dur = -1, (SELECT end_ts FROM trace_bounds) - ts, dur))
-          as maxDur
-        from experimental_slice_layout
-        where filter_track_ids = '${this.trackIds.join(',')}'
-      `);
-      this.maxDur = maxDurResult.firstRow({maxDur: LONG_NULL}).maxDur ?? 0n;
-    }
-
-    const queryRes = await this.engine.query(`
-      SELECT
-        (ts + ${resolution / 2n}) / ${resolution} * ${resolution} as tsq,
-        ts,
-        max(iif(dur = -1, (SELECT end_ts FROM trace_bounds) - ts, dur)) as dur,
-        layout_depth as layoutDepth,
-        name,
-        id,
-        dur = 0 as isInstant,
-        dur = -1 as isIncomplete
-      from experimental_slice_layout
-      where
-        filter_track_ids = '${this.trackIds.join(',')}' and
-        ts >= ${start - this.maxDur} and
-        ts <= ${end}
-      group by tsq, layout_depth
-      order by tsq, layout_depth
-    `);
-
-    const numRows = queryRes.numRows();
-    const slices: SliceData = {
-      start,
-      end,
-      resolution,
-      length: numRows,
-      strings: [],
-      sliceIds: new Float64Array(numRows),
-      starts: new BigInt64Array(numRows),
-      ends: new BigInt64Array(numRows),
-      depths: new Uint16Array(numRows),
-      titles: new Uint16Array(numRows),
-      colors: new Uint16Array(numRows),
-      isInstant: new Uint16Array(numRows),
-      isIncomplete: new Uint16Array(numRows),
-    };
-
-    const stringIndexes = new Map<string, number>();
-    function internString(str: string) {
-      let idx = stringIndexes.get(str);
-      if (idx !== undefined) return idx;
-      idx = slices.strings.length;
-      slices.strings.push(str);
-      stringIndexes.set(str, idx);
-      return idx;
-    }
-    const greenIndex = internString('#4CAF50');
-
-    const it = queryRes.iter({
-      tsq: LONG,
-      ts: LONG,
-      dur: LONG,
-      layoutDepth: NUM,
-      id: NUM,
-      name: STR,
-      isInstant: NUM,
-      isIncomplete: NUM,
-    });
-    for (let row = 0; it.valid(); it.next(), ++row) {
-      const startQ = it.tsq;
-      const start = it.ts;
-      const dur = it.dur;
-      const end = start + dur;
-      const minEnd = startQ + resolution;
-      const endQ = BIMath.max(BIMath.quant(end, resolution), minEnd);
-
-      slices.starts[row] = startQ;
-      slices.ends[row] = endQ;
-      slices.depths[row] = it.layoutDepth;
-      slices.titles[row] = internString(it.name);
-      slices.sliceIds[row] = it.id;
-      slices.isInstant[row] = it.isInstant;
-      slices.isIncomplete[row] = it.isIncomplete;
-      slices.colors![row] = greenIndex;
-    }
-    return slices;
-  }
-}
diff --git a/ui/src/tracks/frames/index.ts b/ui/src/tracks/frames/index.ts
index 12427eb..5cbdd80 100644
--- a/ui/src/tracks/frames/index.ts
+++ b/ui/src/tracks/frames/index.ts
@@ -26,11 +26,9 @@
   STR_NULL,
 } from '../../trace_processor/query_result';
 
-import {ActualFramesTrack} from './actual_frames_track';
 import {
   ActualFramesTrack as ActualFramesTrackV2,
 } from './actual_frames_track_v2';
-import {ExpectedFramesTrack} from './expected_frames_track';
 import {
   ExpectedFramesTrack as ExpectedFramesTrackV2,
 } from './expected_frames_track_v2';
@@ -102,21 +100,6 @@
         trackIds,
         kind: EXPECTED_FRAMES_SLICE_TRACK_KIND,
         trackFactory: ({trackKey}) => {
-          return new ExpectedFramesTrack(
-            engine,
-            maxDepth,
-            trackKey,
-            trackIds,
-          );
-        },
-      });
-
-      ctx.registerTrack({
-        uri: `perfetto.ExpectedFrames#${upid}.v2`,
-        displayName,
-        trackIds,
-        kind: EXPECTED_FRAMES_SLICE_TRACK_KIND,
-        trackFactory: ({trackKey}) => {
           return new ExpectedFramesTrackV2(
             engine,
             maxDepth,
@@ -184,21 +167,6 @@
         trackIds,
         kind: ACTUAL_FRAMES_SLICE_TRACK_KIND,
         trackFactory: ({trackKey}) => {
-          return new ActualFramesTrack(
-            engine,
-            maxDepth,
-            trackKey,
-            trackIds,
-          );
-        },
-      });
-
-      ctx.registerTrack({
-        uri: `perfetto.ActualFrames#${upid}.v2`,
-        displayName,
-        trackIds,
-        kind: ACTUAL_FRAMES_SLICE_TRACK_KIND,
-        trackFactory: ({trackKey}) => {
           return new ActualFramesTrackV2(
             engine,
             maxDepth,
diff --git a/ui/src/tracks/ftrace/index.ts b/ui/src/tracks/ftrace/index.ts
index c3616c6..24dd886 100644
--- a/ui/src/tracks/ftrace/index.ts
+++ b/ui/src/tracks/ftrace/index.ts
@@ -165,6 +165,10 @@
       },
     });
 
+    if (await this.hasFtrace(ctx.engine)) {
+      ctx.addDefaultTab(ftraceTabUri);
+    }
+
     ctx.registerCommand({
       id: 'perfetto.FtraceRaw#ShowFtraceTab',
       name: 'Show Ftrace Tab',
@@ -174,6 +178,18 @@
     });
   }
 
+  private async hasFtrace(engine: EngineProxy): Promise<boolean> {
+    // Check if we have any ftrace events at all
+    const query = `
+      select
+        *
+      from ftrace_event
+      limit 1`;
+
+    const res = await engine.query(query);
+    return res.numRows() > 0;
+  }
+
   private async lookupCpuCores(engine: EngineProxy): Promise<number[]> {
     const query = 'select distinct cpu from ftrace_event';
 
diff --git a/ui/src/tracks/thread_state/index.ts b/ui/src/tracks/thread_state/index.ts
index d14958d..8c6402a 100644
--- a/ui/src/tracks/thread_state/index.ts
+++ b/ui/src/tracks/thread_state/index.ts
@@ -12,35 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import {v4 as uuidv4} from 'uuid';
-
-import {BigintMath as BIMath} from '../../base/bigint_math';
-import {search} from '../../base/binary_search';
-import {assertFalse} from '../../base/logging';
-import {duration, Time, time} from '../../base/time';
-import {Actions} from '../../common/actions';
-import {cropText} from '../../common/canvas_utils';
-import {colorForState} from '../../common/colorizer';
-import {translateState} from '../../common/thread_state';
-import {TrackData} from '../../common/track_data';
-import {TimelineFetcher} from '../../common/track_helper';
-import {checkerboardExcept} from '../../frontend/checkerboard';
-import {globals} from '../../frontend/globals';
-import {PanelSize} from '../../frontend/panel';
+import {uuidv4} from '../../base/uuid';
 import {asThreadStateSqlId} from '../../frontend/sql_types';
 import {ThreadStateTab} from '../../frontend/thread_state_tab';
 import {
   BottomTabToSCSAdapter,
-  EngineProxy,
   Plugin,
   PluginContext,
   PluginContextTrace,
   PluginDescriptor,
-  Track,
 } from '../../public';
 import {getTrackName} from '../../public/utils';
 import {
-  LONG,
   NUM,
   NUM_NULL,
   STR_NULL,
@@ -52,263 +35,6 @@
 
 export const THREAD_STATE_TRACK_KIND = 'ThreadStateTrack';
 
-interface Data extends TrackData {
-  strings: string[];
-  ids: Float64Array;
-  starts: BigInt64Array;
-  ends: BigInt64Array;
-  cpu: Int8Array;
-  state: Uint16Array;  // Index into |strings|.
-}
-
-const MARGIN_TOP = 3;
-const RECT_HEIGHT = 12;
-const EXCESS_WIDTH = 10;
-
-class ThreadStateTrack implements Track {
-  private fetcher = new TimelineFetcher<Data>(this.onBoundsChange.bind(this));
-  private trackKey: string;
-  private engine: EngineProxy;
-  private utid: number;
-  private uuid = uuidv4();
-
-  constructor(trackKey: string, engine: EngineProxy, utid: number) {
-    this.trackKey = trackKey;
-    this.engine = engine;
-    this.utid = utid;
-  }
-
-  private maxDurNs: duration = 0n;
-
-  // Returns a valid SQL table name with the given prefix that should be unique
-  // for each track.
-  private tableName(prefix: string) {
-    // Derive table name from, since that is unique for each track.
-    // Track ID can be UUID but '-' is not valid for sql table name.
-    const idSuffix = this.uuid.split('-').join('_');
-    return `${prefix}_${idSuffix}`;
-  }
-
-  async onCreate() {
-    await this.engine.query(`
-      create view ${this.tableName('thread_state')} as
-      select
-        id,
-        ts,
-        dur,
-        cpu,
-        state,
-        io_wait as ioWait
-      from thread_state
-      where utid = ${this.utid} and utid != 0
-    `);
-
-    const queryRes = await this.engine.query(`
-      select ifnull(max(dur), 0) as maxDur
-      from ${this.tableName('thread_state')}
-    `);
-    this.maxDurNs = queryRes.firstRow({maxDur: LONG}).maxDur;
-  }
-
-  async onUpdate() {
-    await this.fetcher.requestDataForCurrentTime();
-  }
-
-  async onBoundsChange(start: time, end: time, resolution: duration):
-      Promise<Data> {
-    const query = `
-      select
-        (ts + ${resolution / 2n}) / ${resolution} * ${resolution} as tsq,
-        ts,
-        state = 'S' as is_sleep,
-        max(dur) as dur,
-        ifnull(cast(cpu as integer), -1) as cpu,
-        state,
-        ioWait,
-        ifnull(id, -1) as id
-      from ${this.tableName('thread_state')}
-      where
-        ts >= ${start - this.maxDurNs} and
-        ts <= ${end}
-      group by tsq, is_sleep
-      order by tsq
-    `;
-
-    const queryRes = await this.engine.query(query);
-    const numRows = queryRes.numRows();
-
-    const data: Data = {
-      start,
-      end,
-      resolution,
-      length: numRows,
-      ids: new Float64Array(numRows),
-      starts: new BigInt64Array(numRows),
-      ends: new BigInt64Array(numRows),
-      strings: [],
-      state: new Uint16Array(numRows),
-      cpu: new Int8Array(numRows),
-    };
-
-    const stringIndexes = new Map<
-        {shortState: string | undefined; ioWait: boolean | undefined},
-        number>();
-    function internState(
-      shortState: string|undefined, ioWait: boolean|undefined) {
-      let idx = stringIndexes.get({shortState, ioWait});
-      if (idx !== undefined) return idx;
-      idx = data.strings.length;
-      data.strings.push(translateState(shortState, ioWait));
-      stringIndexes.set({shortState, ioWait}, idx);
-      return idx;
-    }
-    const it = queryRes.iter({
-      'tsq': LONG,
-      'ts': LONG,
-      'dur': LONG,
-      'cpu': NUM,
-      'state': STR_NULL,
-      'ioWait': NUM_NULL,
-      'id': NUM,
-    });
-    for (let row = 0; it.valid(); it.next(), row++) {
-      const startQ = it.tsq;
-      const start = it.ts;
-      const dur = it.dur;
-      const end = start + dur;
-      const minEnd = startQ + resolution;
-      const endQ = BIMath.max(BIMath.quant(end, resolution), minEnd);
-
-      const cpu = it.cpu;
-      const state = it.state || undefined;
-      const ioWait = it.ioWait === null ? undefined : !!it.ioWait;
-      const id = it.id;
-
-      // We should never have the end timestamp being the same as the bucket
-      // start.
-      assertFalse(startQ === endQ);
-
-      data.starts[row] = startQ;
-      data.ends[row] = endQ;
-      data.state[row] = internState(state, ioWait);
-      data.ids[row] = id;
-      data.cpu[row] = cpu;
-    }
-    return data;
-  }
-
-  async onDestroy() {
-    if (this.engine.isAlive) {
-      await this.engine.query(
-        `drop view if exists ${this.tableName('thread_state')}`);
-    }
-    this.fetcher.dispose();
-  }
-
-  getHeight(): number {
-    return 2 * MARGIN_TOP + RECT_HEIGHT;
-  }
-
-  render(ctx: CanvasRenderingContext2D, size: PanelSize): void {
-    const {
-      visibleTimeScale: timeScale,
-      visibleTimeSpan,
-    } = globals.timeline;
-    const data = this.fetcher.data;
-    const charWidth = ctx.measureText('dbpqaouk').width / 8;
-
-    if (data === undefined) return;  // Can't possibly draw anything.
-
-    // The draw of the rect on the selected slice must happen after the other
-    // drawings, otherwise it would result under another rect.
-    let drawRectOnSelected = () => {};
-
-    checkerboardExcept(
-      ctx,
-      this.getHeight(),
-      0,
-      size.width,
-      timeScale.timeToPx(data.start),
-      timeScale.timeToPx(data.end),
-    );
-
-    ctx.textAlign = 'center';
-    ctx.font = '10px Roboto Condensed';
-
-    for (let i = 0; i < data.starts.length; i++) {
-      // NOTE: Unlike userspace and scheduling slices, thread state slices are
-      // allowed to overlap; specifically, sleeping slices are allowed to
-      // overlap with non-sleeping slices. We do this because otherwise
-      // sleeping slices generally dominate traces making it seem like there are
-      // no running/runnable etc. slices until you zoom in. By drawing both,
-      // we get a more accurate representation of the trace and prevent weird
-      // artifacts when zooming.
-      // See b/201793731 for an example of why we do this.
-      const tStart = Time.fromRaw(data.starts[i]);
-      const tEnd = Time.fromRaw(data.ends[i]);
-      const state = data.strings[data.state[i]];
-      if (!visibleTimeSpan.intersects(tStart, tEnd)) {
-        continue;
-      }
-
-      // Don't display a slice for Task Dead.
-      if (state === 'x') continue;
-      const rectStart = timeScale.timeToPx(tStart);
-      const rectEnd = timeScale.timeToPx(tEnd);
-      const rectWidth = rectEnd - rectStart;
-
-      const currentSelection = globals.state.currentSelection;
-      const isSelected = currentSelection &&
-          currentSelection.kind === 'THREAD_STATE' &&
-          currentSelection.id === data.ids[i];
-
-      const colorScheme = colorForState(state);
-      ctx.fillStyle = colorScheme.base.cssString;
-      ctx.fillRect(rectStart, MARGIN_TOP, rectWidth, RECT_HEIGHT);
-
-      // Don't render text when we have less than 10px to play with.
-      if (rectWidth < 10 || state === 'Sleeping') continue;
-      const title = cropText(state, charWidth, rectWidth);
-      const rectXCenter = rectStart + rectWidth / 2;
-      ctx.fillStyle = colorScheme.textBase.cssString;
-      ctx.fillText(title, rectXCenter, MARGIN_TOP + RECT_HEIGHT / 2 + 3);
-
-      if (isSelected) {
-        drawRectOnSelected = () => {
-          const rectStart =
-              Math.max(0 - EXCESS_WIDTH, timeScale.timeToPx(tStart));
-          const rectEnd =
-              Math.min(size.width + EXCESS_WIDTH, timeScale.timeToPx(tEnd));
-          ctx.strokeStyle = colorScheme.base.cssString;
-          ctx.beginPath();
-          ctx.lineWidth = 3;
-          ctx.strokeRect(
-            rectStart,
-            MARGIN_TOP - 1.5,
-            rectEnd - rectStart,
-            RECT_HEIGHT + 3);
-          ctx.closePath();
-        };
-      }
-    }
-    drawRectOnSelected();
-  }
-
-  onMouseClick({x}: {x: number}) {
-    const data = this.fetcher.data;
-    if (data === undefined) return false;
-    const {visibleTimeScale} = globals.timeline;
-    const time = visibleTimeScale.pxToHpTime(x);
-    const index = search(data.starts, time.toTime());
-    if (index === -1) return false;
-    const id = data.ids[index];
-    globals.makeSelection(
-      Actions.selectThreadState({id, trackKey: this.trackKey}));
-    return true;
-  }
-}
-
-
 class ThreadState implements Plugin {
   onActivate(_ctx: PluginContext): void {}
 
@@ -337,24 +63,13 @@
     });
     for (; it.valid(); it.next()) {
       const utid = it.utid;
-      const upid = it.upid;
       const tid = it.tid;
       const threadName = it.threadName;
       const displayName =
           getTrackName({utid, tid, threadName, kind: THREAD_STATE_TRACK_KIND});
 
       ctx.registerTrack({
-        uri: `perfetto.ThreadState#${upid}.${utid}`,
-        displayName,
-        kind: THREAD_STATE_TRACK_KIND,
-        utid: utid,
-        trackFactory: ({trackKey}) => {
-          return new ThreadStateTrack(trackKey, ctx.engine, utid);
-        },
-      });
-
-      ctx.registerTrack({
-        uri: `perfetto.ThreadState#${utid}.v2`,
+        uri: `perfetto.ThreadState#${utid}`,
         displayName,
         kind: THREAD_STATE_TRACK_KIND,
         utid,